常见方法:

1.start 和 run:
  1. start():启动一个新线程,在新的线程运行 run 方法中的代码
  2. **注意:**start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException
  3. run():新线程启动后会调用的方法
  4. 如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法,否则默认不执行任何操作。但可以创建 Thread 的子类对象,来覆盖默认行为

2.sleep和yield:
  1. sleep
  2. 1.调用sleep会让当前线程从Running进入Timed Waiting状态**(阻塞)**
  3. 2.其他线程使用interrupt方法打断正在睡眠的线程,此时sleep方法会抛出InterrupedException
  4. 3.睡眠结束后的线程未必会立即执行
  5. 4.建议使用TimeUnitsleep代替Threadsleep来获得更好的可读性
  6. yield
  7. 1.调用yield会让当前线程从Running进入Runnable**就绪**状态,然后调度执行其他线程
  8. 2.具体的实现依赖于操作系统的任务调度器(可能没有其他线程,调用yield后还是会分给当前线程)

区别:

操作系统的时间调度器可以将cpu分配给就绪状态的线程,但是不能分配给阻塞状态的线程

3.优先级:setPriority() 默认为5 范围是1-10

4.join:等待调用join的线程运行结束

join可以有参数,表示最多等待的时间(毫秒)

线程的同步(需要等待结果的返回)

1646718430383.png

5.interrupt:打断正在运行的线程

打断 sleep,wait,join 的线程会重置打断标记为false

isInterrupted():可以获取打断标记,正常运行的线程并不会直接被打断,可通过打断标记判断,若被打断则结束线程

interrupted():判断完是否被打断之后,会清楚打断标记(true->false)

多线程设计模式之两阶段终止:

T1线程‘’优雅的‘’终止线程T2 优雅:给T2一个做其他事情的机会(通过我们写的代码)

错误思路

使用线程对象的 stop() 方法停止线程
  1. stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁

使用 System.exit(int) 方法停止线程
  1. 目的仅是停止一个线程,但这种做法会让整个程序都停止

两阶段终止模式:

1646719847015.png

6.不推荐使用的方法

这些方法已过时,容易破坏同步代码块,造成线程死锁

stop() 停止线程运行

suspend() 挂起(暂停)线程运行

resume() 恢复线程运行