# 1.start()和run()

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

image.png

image.png 很明显当调用start()方法时是当前线程执行了打印。如果是run()方法则是主线程执行了打印

  • 再看一下线程状态

image.png

# 2.sleep()

  • 解析
    • 1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
    • 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
    • 睡眠结束后的线程未必会立刻得到执行
    • 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
  • 测试

image.png

  • 其他线程调用interrupt方法

image.png

# 3.yield()

  • 方法解释
    • 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
    • 具体的实现依赖于操作系统的任务调度器

# 4.sleep()和yield()的区别

sleep()会让线程进入阻塞状态而yield()会让线程进入就绪状态,进入就绪状态的线程会重新获得cpu的时间片然后继续执行。而阻塞状态的线程不会获得cpu的时间片只有等待阻塞结束了才可能获得cpu时间片从而继续执行

# 5.join()

  • 说明:
    • 等待线程运行结束,调用哪个线程的join方法就是等待哪个线程结束之后继续运行。
    • 如果join(1500)里面加了参数则代表最多等待1.5秒后结束。
  • 测试

image.png

# 6.interrupt()

  • 打断阻塞状态的线程

image.png

  • 打断正常运行的线程

image.png

  • 总结:interrupt方法如果打断的是阻塞状态的线程会抛出一个InterruptedException异常,并且被打断后也会清除掉打断标记。而如果打断的是正在运行的线程则打断标记会被致为true,可以通过这种方式优雅的打断停止某个线程的执行。优雅永不过时!!!
  • isInterrupted()和interrupted()
    • isInterrupted()是判断当前线程是否被打断。不会清除打断标记.
    • interrupted()是判断当前线程是否被打断。会清除打断标记.也就是当线程打断标记为true的话 执行了这个方法,打断标记就变为false