线程的控制

join线程

  1. 在线程A中,如果线程B对象调用了 join() 方法,则线程A会阻塞,直到线程B执行完后才能继续执行。线程B就是join线程。
  2. 另一个比较好理解的解释:join是加入的意思,当线程B在线程A中调用了join方法,说明B线程要加入A线程,所以线程A会阻塞到线程B执行完后才能继续执行。
  3. 相关方法
  • join() :线程A等到线程B执行完
  • join(long millis):线程A等待了millis毫秒后就不再等待了

线程睡眠(sleep)

  1. sleep方法是Thread类的方法
  2. 在某个线程内调用了Thread.sleep(2000);,则表示该线程会阻塞2秒钟后会转为就绪状态等待调度执行。

线程让步(yield)

  1. 当某个线程内调用了Thread.yield();当前线程将立即转入就绪状态,然后系统的线程调度器重新调度一次。需要注意的是,只有优先级与当前线程相同或更高的处于就绪状态的线程才会有获得执行的机会。
  2. 重新调度时,很有可能会再次调度到当前线程。
  3. 示例

#sleep和yield区别

  1. sleep方法暂停该线程后,会给其他线程的执行机会,但是不会理会其他线程的优化级。而yield只有相同或更高的才有执行机会。
  2. sleep方法在阻塞时间过了后才将线程转为就绪状态。而yield是将线程直接转为就绪状态。
  3. sleep方法比yield有更好的移植性,通常不建议使用yield方法控制并发线程的执行。

#设置线程优先级

  1. 在调用start方法之前设置:
TestThread t = new TestThread();
// 设置优先级
t.setPriority(Thread.MAX_PRIORITY);
t.start();
  1. 设置优化级最好只用MAX_PRIORITY=10、MIN_PRIORITY=1、NORM_PRIORITY=5这三个值,因为优化级与电脑系统相关。其他优化级不能完全与Java对应。

#守护线程(后台线程、精灵线程)

  1. 线程在启动之前设置了daemon属性为true的线程就是守护线程。
DaemonThread t = new DaemonThread();
// 一定要先设置daemon属性再启动。可通过t.isDaemon属性判断是否是后台线程
t.setDaemon(true);
t.start();
  1. 守护线程特点
    1) 所有前台线程都死亡,则JVM会通知后台线程会自动死亡。
    2)前台线程创建的子线程默认是前台线程,后台线程创建的子线程默认是后台线程
  2. 守护线程的应用:JVM的垃圾回收线程
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页