A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 短板 中级黑马   /  2015-4-6 11:19  /  777 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class JoinDemo
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 Join j = new Join();
  6.                 Thread t1 = new Thread(j);
  7.                 Thread t2 = new Thread(j);
  8.                 t1.start();
  9.                 t2.start();
  10.                 t1.join();

  11.                 for (int x=0;x<80 ;x++ )
  12.                 {
  13.                         System.out.println("main______"+x);
  14.                 }
  15.         }
  16. }
复制代码



这个程序 如果之前cpu执行的是t2 ,  t1 join后   t2如何运行 是等待t1结束么?

3 个回复

倒序浏览
不是,这里与她
回复 使用道具 举报
不是,这里与t2无关,是main线程会等待t1执行完才会再执行,t1与t2会交替执行
回复 使用道具 举报
首先:要明确join() 方法的作用:让“主线程”等待“子线程”结束之后才能继续运行。
记着是主线程!!!你可以理解为:“父”执行调用到“子”,并不一定非得是main方法,而是调用到“子”线程的“父线程”才是主线程。
接着,我们看你的代码:

  1. class JoinDemo
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                 Join j = new Join();
  6.                 Thread t1 = new Thread(j);
  7.                 Thread t2 = new Thread(j);
  8.                 t1.start();
  9.                 t2.start();
  10.                 t1.join();

  11.                 for (int x=0;x<80 ;x++ )
  12.                 {
  13.                         System.out.println("main______"+x);
  14.                 }
  15.         }
  16. }
复制代码

此时,一共三个线程(主线程,t1,t2),cpu资源在 t2 手里。除非下一刻main(主线程)抢到执行权,否则 t1 或者 t2 会交替执行也可能 t2继续保持执行权。假设主线程(你的例子里是main方法)方法抢到执行权执行到 t1.join();主线程就开始等待,直到t1执行的停止(此时只有 t1 和 t2 在抢夺执行权);此刻主线程不管t2如何,只要 t1 一旦停止执行,它就和 t1、t2 再一起抢夺执行权,此时这个 join()方法也就执行过去了,剩下的时间就是三个线程相互抢了(因为默认优先级都是5,不存在谁抢的更多,多运行几次就知道了)。所以此刻不关 t2 它什么事。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马