java基础-基础知识点

文章目录

      • jdk目录结构
      • 函数式接口
      • wait、notify、notifyAll
    • 并发编程
      • Thread
        • sleep、yield、join
        • daemon (守护线程)
        • [synchronized ](https://blog.csdn.net/EnjoyFight/article/details/127457876)
        • 线程池

jdk目录结构

jdk1.8
在这里插入图片描述

jdk20
在这里插入图片描述

函数式接口

https://blog.csdn.net/Don_t_always_ail/article/details/132222951

wait、notify、notifyAll

在这里插入图片描述

package com.example.demo4.jdk;import java.util.UUID;public class WaitTest {public static void main(String[] args) {Print print = new Print();new Thread(() -> {for (int i = 0; i < 28; i++) {print.printNum();}}).start();new Thread(() -> {for (int i = 0; i < 26; i++) {print.printChar();}}).start();}}class Print{private int flag = 1;private int count = 1;public synchronized void printNum(){if(flag == 2 && count < 27){try {wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.print(2*count-1);System.out.print(2*count);flag = 2;if(count < 27){notify();}}public synchronized void printChar(){if(flag == 1){try {wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println((char)(count - 1 + 'A'));flag = 1;count++;notify();
//        notifyAll();}
}

并发编程

  • 可见性:synchronized
  • 有序性
  • 原子性

Thread

线程状态
在这里插入图片描述
在这里插入图片描述
线程状态。 线程可以处于以下状态之一:

  • NEW
    尚未启动的线程处于此状态。
  • RUNNABLE
    在Java虚拟机中执行的线程处于此状态。
  • BLOCKED
    被阻塞等待监视器锁定的线程处于此状态。
  • WAITING
    正在等待另一个线程执行特定动作的线程处于此状态。
  • TIMED_WAITING
    正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
  • TERMINATED
    已退出的线程处于此状态。

sleep、yield、join

  • sleep​(long millis) :使当前正在执行的线程停留(暂停执行)指定的毫秒数,这取决于系统定时器和调度程序的精度和准确性。

  • sleep​(long millis, int nanos) :导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。

  • yield​() :对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。

  • join​() :等待这个线程死亡。

  • void join​(long millis) :等待这个线程死亡 millis毫秒。

package com.example.demo4.thread;public class JoinTest implements Runnable {private String name;public JoinTest(String name){this.name = name;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(name + i);}}public static void main(String[] args) {JoinTest joinTest = new JoinTest("vip线程:");Thread thread1 = new Thread(joinTest);thread1.start();for (int i = 0; i < 50; i++) {if(i == 40){try {thread1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("主线程:" + i);}}
}

daemon (守护线程)

  • 此线程标记为daemon线程或用户线程。 当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。
  • 线程启动前必须调用此方法。

synchronized

线程池

package com.example.demo4.thread;import org.junit.jupiter.api.Test;import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.*;public class ThreadPoolSizeTest {@Testpublic void test() throws InterruptedException {new HashMap<>();ThreadPoolExecutor executorService = new ThreadPoolExecutor(2, 3, 30, TimeUnit.SECONDS,new LinkedBlockingQueue<>(2), Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardPolicy());//每隔两秒打印线程池的信息ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);scheduledExecutorService.scheduleAtFixedRate(() -> {System.out.println("=====================================thread-pool-info:" + new Date() + "=====================================");System.out.println("CorePoolSize:" + executorService.getCorePoolSize());System.out.println("PoolSize:" + executorService.getPoolSize());System.out.println("ActiveCount:" + executorService.getActiveCount());System.out.println("KeepAliveTime:" + executorService.getKeepAliveTime(TimeUnit.SECONDS));System.out.println("QueueSize:" + executorService.getQueue().size());}, 0, 2, TimeUnit.SECONDS);try {//同时提交5个任务,模拟达到最大线程数for (int i = 0; i < 5; i++) {executorService.execute(new Task());}} catch (Exception e) {e.printStackTrace();}//休眠10秒,打印日志,观察线程池状态Thread.sleep(10000);//每隔3秒提交一个任务while (true) {Thread.sleep(3000);executorService.submit(new Task());}}static class Task implements Runnable {@Overridepublic void run(){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "-执行任务");}}
}

结论:

  • 线程池数达到最大时如果在规定时间内一直有任务进入,则线程池数量不会减少

为何【ArrayList】为线程不安全的?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108372.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023 年前端编程 NodeJs 包管理工具 npm 安装和使用详细介绍

npm 基本概述 npm is the world’s largest software registry. Open source developers from every continent use npm to share and borrow packages, and many organizations use npm to manage private development as well. npm 官方网站&#xff1a;https://www.npmjs.…

HBase 记录

HBase 管理命令 hbase hbck -details TABLE_NAME hbase hbck -repair TABLE_NAMEHBase概览 Master、RegionServer作用 RegionServer与Region关系 数据定位原理 https://blogs.apache.org/hbase/entry/hbase_who_needs_a_master RegionServer HBase Essentials.pdf (P25)…

第二证券:举牌和收购有什么区别?

在股市中&#xff0c;举牌和收买是两种常见的出资策略。虽然这两种策略都是用来取得股权控制权&#xff0c;但举牌和收买仍是有着一些差异&#xff0c;下面从多个角度进行剖析。 一、定义和方法 从定义上来看&#xff0c;举牌是指出资者购买公司股票的数量已到达公司股份总量的…

Lyft 计划开源人工智能算法测试工具

共享租车公司 Lyft 投入大量时间和资源开发工具来测试机器学习算法&#xff0c;近日 Lyft 宣布将向公众开源这些工具。正式投入生产环境之前&#xff0c;一款机器学习算法的测试和更替非常耗费时间&#xff0c;Lyft 开发的测试工具&#xff0c;是属于一种模拟器&#xff0c;能够…

紫光展锐5G芯T820 解锁全新应用场景,让机器人更智能

数字经济的持续发展正推动机器人产业成为风口赛道。工信部数据显示&#xff0c;2023年上半年&#xff0c;我国工业机器人产量达22.2万套&#xff0c;同比增长5.4%&#xff1b;服务机器人产量为353万套&#xff0c;同比增长9.6%。 作为国内商用服务机器人领先企业&#xff0c;云…

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群&#xff08;1&#xff09;初始化&#xff08;2&#xff09;部署网络插件flannel&#xff08;3&#xff09;创建 pod 资源 5.部署 …

【计算机网络】图解应用层协议

图解应用层协议 1.应用层2.远程登录2.1 Telnet2.2 SSH 3.文件传输3.1 FTP3.2 TFTP 4.电子邮件4.1 通信架构4.2 邮件地址4.3 SMTP 协议4.4 POP3 协议4.5 IMAP 协议 5.WWW5.1 URI5.2 HTML5.3 HTTP 6.网络管理应用6.1 DHCP 协议6.2 DNS 协议 1.应用层 我们前面介绍过 TCP / IP 模…

YOLO目标检测——火焰检测数据集+已标注xml和txt格式标签下载分享

实际项目应用&#xff1a;火灾预警系统、智能监控系统、工业安全管理、森林火灾监测以及城市规划和消防设计等应用场景中具有广泛的应用潜力&#xff0c;可以提高火灾检测的准确性和效率&#xff0c;保障人员和财产的安全。数据集说明&#xff1a;YOLO火焰目标检测数据集&#…

Cocos独立游戏开发框架(18):配置管理器

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。 在游戏开发中&#xff0c;配置是一个重要的角色&#xff0c;他常常由策划去驱动&#xff0c;调整和优化&#xff0c;使得游戏的难度和设定更加符合玩家们的体验&#xff0c;…

JDK、eclipse软件的安装

一、打开JDK安装包 二、复制路径 三、点击我的电脑&#xff0c;找到环境变量 四、新建环境 变量名&#xff1a;JAVA_HOME 变量值就是刚刚复制的路径 五、在path中建立新变量 双击path 打印以下文字 最后一直双击确定&#xff0c;安装环境完成。 六、双击eclipse 选择好安装…

zabbix监控H3C设备

背景 常见的服务和主机已经使用Prometheus进行监控了&#xff0c;但是网络设备还未配置监控。使用基于SNMP对网络设备进行监控。 设备概览 主要类型为H3C的路由器和交换机。 H3CS5560交换机 路由器MER5200 er8300 一台群晖的NAS服务 步骤 配置网络设备开启telnet远程&…

centos7安装kubernets集群

一、准备工作 准备三台虚拟机&#xff0c;centos7系统 二、系统配置 1. 修改主机名 # 三台机器都需要执行 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node22. 修改hosts文件 # 三台机器都需要执行 [rootk8s-…