1.Thread 类的基本用法
-
线程创建
-
Thread()
- 继承 Thread, 重写 run
- 实现 Runnable, 重写 run
- 继承 Thread, 重写 run, 使用匿名内部类
- 实现 Runnable, 重写 run, 使用匿名内部类
- 使用 lambda 表达式
-
线程中断
-
isInterrupted()
简单理解线程t来判断是否中断了 t
如果线程t中断则.isInterrupted()的返回值为true,反之为false
注意:
此时lambda表达式的定义是在new Thread之前,也就是还没创建对象t
这时候我们就要用到Thread.currentThread()方法了
currentThread()
currentThread()也是种静态方法,哪个对象调用这个方法,就返回哪个对象的引用
由于currentThread方法,是在t.start 之后,才执行的,并且currentThread是在t线程中执行的,所以在t线程中,执行currentThread方法,得到的是t线程的引用。
这里再 同样引入一个方法
interrupt()
作用:把标志位由false变为true
而isinterrupted()表示一种状态,interrupt()表示修改状态的一种方式
(可以理解为一种为形容词,一种为动词)
特殊情况
线程终止这里有个奇怪设定:
如果t线程正在sleep,此时main中调用interrupt方法,就会把sleep提前唤醒
//interrupt会把sleep状态提前唤醒,就会抛出异常,这时就会把isIterrupted状态由true改为false
在catch中打印,是为了证明,异常会把isIterrupted状态由true改为false
ps:图中还出现break,添加break让线程终止
//在break之前,也可以加一些别的程序,就像相当于dosomething();稍后结束
总结
使用 Interrupt 方法的时候:
1. t 线程没有进行 sleep 等阻塞操作
t 的 isInterrupted() 方法返回 true
通过循环条件结束 t 线程
2. t 线程中进行了 sleep 等阻塞操作
t 的 isInterrupted() 还是会返回 true
但是 sleep 如果是被提前唤醒,抛出 InterruptedException
同时也会把 isInterrupted() 的返回结果设为 false
此时就需要手动决定是否要结束线程了
-
线程等待
join()
线程t调用join()方法 t.join()表示线程t"被等待”,main线程为“等待的一方”
通俗理解字面意思:主线程等待t线程执行完后再执行(main等待t的加入)
结果:
-
线程休眠
Thread.sleep()
Thread.sleep(long millis) //时间为毫秒为单位
-
获取线程实例
Thread.currentThread()
简单来说就是:返回当前线程对象的引用(上文有详细提及,见目录)