一、线程和进程的区别:
进程是系统分配资源的最小单位,线程是系统调度的最小单位。
每个进程至少有一个线程存在,即主线程。
进程是有自己的独立地址空间的,有进程控制块(PCB)来控制进程的状态变换,也有专门的算法来控制进程的调度(先进先出,高优先比优先,短作业优先,时间片轮转等),线程是共享进程的资源的,JVM会为每一个线程划分特殊的空间:
二、并发和并行
并发: 多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发。(也就是同一时间只有一个进程在执行)
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
三、线程创建的方法
1.通过继承Thread类
2.实现Runnable接口
3.其他变形
四、线程常见属性
- ID 是线程的唯一标识,不同线程不会重复
- 名称是各种调试工具用到
- 状态表示线程当前所处的一个情况,下面我们会进一步说明
- 优先级高的线程理论上来说更容易被调度到
- 关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
- 是否存活,即简单的理解,为 run 方法是否运行结束了
- 线程的中断问题,下面我们进一步说明
五、start()和run()方法
复写run()方法是提供给线程要做的事情的指令清单,而start()方法则是线程真正独立的去执行了
六、中断一个线程
1.调用.thread()方法进行中断
2.通过共享标记来通知
都是通过改变线程中标志位来让线程中断,当线程已经调用wait/join/sleep方法而阻塞挂起,那么interrupt方法就会抛出InterruptedException 异常,清除中断标志
Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志
Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标志
七、等待一个线程
作用: 等待一个线程完成后,才进行下一个线程;
用法: 调用.join()方法 (无参就是等待上一个线程完成,有参就是等待参数时间后执行下一个线程,如果当前参数时间超过上个线程执行时间,那么以线程时间执行完毕为准)
public class Test{
public static void main(String[] args) throws InterruptedException {
Thread t1 =new Thread(new Runnable() {
@Override
public void run() {
System.out.println("t1开始执行睡眠");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 =new Thread(new Runnable() {
@Override
public void run() {
System.out.println("t2开始执行睡眠");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t1.join(); //t2等待t1完成后执行
t2.start();
t2.join(); //主线程等待t2完成后执行
System.out.println("主线程结束");
}
}
八、获得当前线程引用
调用Thread.currentThread()方法即可
例Thread t1 = Thread.currentThread();
九、休眠当前线程
十、线程的状态转换
for(Thread.State state : Thread.State.values()){
System.out.println(state);
}
状态转换图:
十一、yeild方法
Yeild()方法就是让出cpu让别的线程去执行,自己会回到就绪态等待执行。
public class Test{
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("t1正在执行");
Thread.yield();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;i<10;i++){
System.out.println(i);
}
}
}).start();
}
}
结果:先输出0-9然后一直输出t1正在执行
来源:CSDN
作者:阴阳两界
链接:https://blog.csdn.net/qq_45349785/article/details/104677314