线程

启动线程

在同一个Thread的对象来说,start只可以调用一次,但是同时存在调用两个,会出现报错但是不会影响其中一个运行

 

终止线程

让线程的入口run方法提前结束

主要看代码如何写

把线程的判断条件写成一个变量,在增加判断条件,让变量改变,达到线程提前结束

 

 

如果把isQuit写成局部变量的话,lambda表达式会使用变量捕获,它的语法规则是捕获的变量要是final类型的,但是局部变量加上了final,后面就不能进行修改了,所以只能写成成员变量

 

线程提前结束的内置变量

Thread.currentthread()是获取当前线程实例,相当于就是获取t这个对象

isInterrupted()就是我们手动创建的变量

interrrup就是让线程终止

改变isInterrupted为true

 

 当我们运行此代码时就会显示报错,且代码会继续执行,是因为sleep会把标志位清空,解决的办法就是在catch最后加上一个break

 

 

 

等待线程(等待结束)

线程的执行顺序是无序的,结束的时间也是不确定的,要想做到比如1线程结束后,再到2线程结束,就可以使用join方法,谁要先结束线程,谁就调用join

t线程和t2线程两个线程进行并发执行,主线程先调用t.join等待t线程把循环走完获取结果运行结束,在待用t2.join等待t2线程把循环走完获取结果运行结束,最后主线程把t和t2的运行结果统计相加后输出运行结束

 

 如果把把t.join写在t2的开头就会变成先执行t线程,t2线程就会进入阻塞状态,等t执行完之后,t2才会继续执行

 如果是这样写的话就会变成,先启动t线程然后等待t线程结束,在启动t2线程等待结束,相当于就是串行执行,这样就没有达到并发执行

 join也有分为4种

1.无参数的(相当于你的代码在死等)

2.带有超时时间的等待(超过给定的时间就不等待了)

3.会指定等待时间,超过等待时间就会返回false

4..带有超时时间毫秒和纳秒的等待(超过给定的时间就不等待了)

 

线程的状态

1.new  Thread对象创建好后但是还没有调用stat方法在系统中创建线程

2.terminated   Thread对象仍然存在,但是在系统内部的线程已经执行完毕了

3.runnable  就绪状态表示这个线程正在或者是随时准备去cpu上执行

4.timed-waitng  指定时间的阻塞,达到一定的时间之后会自动解除阻塞

5.waiting  不带时间的阻塞,满足一定条件才会解除阻塞

6.blocked  由锁竞争,引起的阻塞

可以使用getstate来查看线程的状态

 

posted @ 2025-02-19 16:41  油头男孩  阅读(8)  评论(0)    收藏  举报