这是我参与「掘金日新计划 · 6 月更文挑战」的第13天 ,点击查看活动详情
对于并发来说,目前就是处于多个线程共同抢占同一个资源来展开的,
线程: 进程中单个可操作的最小逻辑单位,
面试题: 创建线程的方法:
创建线程的方法,
- 继承Thread类
- 实现Runnable接口
- 实现callable接口
- 线程池
1.创建线程
匿名内部类,加上lambda表达式
new Thread(new Runnable() {
public void run() {
System.out.println("haha");
}
}).start();
我们使用实现接口Runnable的方式,因为组合中组合优于继承(Prefer composition over inheritance)
降低耦合,java是单继承
Runnable中的run()方法并不是你所创建的线程调用的,而是调用你这个线程的线程调用的,也就是主线程。
其中 启动线程的是start(),
测试:
用两种不同的方式,创建出两个线程,交差打印1~100之间的奇数和偶数,并断点调试。
public void run() {
int jishu = 0;
int oushu = 0;
for (int i = 1; i < 100; i++) {
if (i % 2 == 0){
oushu++;
}else jishu++;
}
System.out.println("奇数有"+jishu);
System.out.println("偶数有"+oushu);
}
}).start();
常用于线程的使用于,多个请求处理抢占资源,当多个人去抢夺同一件资源之后 这个里面的资源的把控和对于外界告诉当前的资源所剩比例,或者说是当前是否可以进去直接抢占 就和我们之前提到的锁相关,以及数据可见性有关
这几个创建的方法其实都可以,但是我们常用的还是线程池的使用 利用池化的思想,可以减少对于链接的损耗,提高管控的能力,积极的可以对所需要的资源进行整理
当前我们侧重点是支持线程池数据中的基本参数,
-
corePoolSize:核心线程数
-
maximumPoolSize:最大线程数
-
unit:时间单位
-
workQueue:工作队列
-
线程最大存货时间等
类似于银行机制,柜台取钱的操作,如果可以就进行数据处理,如果不行 将可以对数据直接进行放到工作队列里面等