# 1.start()和run()
- start()
- 功能:启动一个新线程,在新的线程运行 run 方法中的代码
- 注意:start 方法只是让线程进入就绪,里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateException
- run()
- 功能:新线程启动后会调用的方法
- 注意:如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法,否则默认不执行任何操作。但可以创建 Thread 的子类对象,来覆盖默认行为
- 通过代码具体看一下俩者区别
很明显当调用start()方法时是当前线程执行了打印。如果是run()方法则是主线程执行了打印
- 再看一下线程状态
# 2.sleep()
- 解析
- 1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
- 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
- 睡眠结束后的线程未必会立刻得到执行
- 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
- 测试
- 其他线程调用interrupt方法
# 3.yield()
- 方法解释
- 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
- 具体的实现依赖于操作系统的任务调度器
# 4.sleep()和yield()的区别
sleep()会让线程进入阻塞状态而yield()会让线程进入就绪状态,进入就绪状态的线程会重新获得cpu的时间片然后继续执行。而阻塞状态的线程不会获得cpu的时间片只有等待阻塞结束了才可能获得cpu时间片从而继续执行
# 5.join()
- 说明:
- 等待线程运行结束,调用哪个线程的join方法就是等待哪个线程结束之后继续运行。
- 如果join(1500)里面加了参数则代表最多等待1.5秒后结束。
- 测试
# 6.interrupt()
- 打断阻塞状态的线程
- 打断正常运行的线程
- 总结:interrupt方法如果打断的是阻塞状态的线程会抛出一个InterruptedException异常,并且被打断后也会清除掉打断标记。而如果打断的是正在运行的线程则打断标记会被致为true,可以通过这种方式优雅的打断停止某个线程的执行。优雅永不过时!!!
- isInterrupted()和interrupted()
- isInterrupted()是判断当前线程是否被打断。不会清除打断标记.
- interrupted()是判断当前线程是否被打断。会清除打断标记.也就是当线程打断标记为true的话 执行了这个方法,打断标记就变为false