线程
启动线程
在同一个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来查看线程的状态


浙公网安备 33010602011771号