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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 湛添友 中级黑马   /  2014-4-6 23:49  /  861 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对join()的用法不理解!  若A线程等待了,前面那个线程是不是也跟着挂了

8 个回复

倒序浏览
能说清楚点吗?
回复 使用道具 举报
湛添友 来自手机 中级黑马 2014-4-7 00:33:09
藤椅
Peach2014 发表于 2014-4-6 23:54
能说清楚点吗?

比如有主线程和A线程,然后调用A.join()再让A进入被wait   这样是不是主线程也挂了,有何方法让主线程活过来?
回复 使用道具 举报
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
所以你的A不可能被wait,一中断就抛一个异常,然后再把你的中断清除
回复 使用道具 举报
本帖最后由 Peach2014 于 2014-4-7 10:18 编辑
湛添友 发表于 2014-4-7 00:33
比如有主线程和A线程,然后调用A.join()再让A进入被wait   这样是不是主线程也挂了,有何方法让主线程活 ...


当执行到A.join()方法时,一定会等待A线程执行完才会回到主线程来执行。如果想要让主线程活,就只能等到A线程死。这时可以调用Interrupt()方法,强制主线程活过来,同时会触发异常。
回复 使用道具 举报
湛添友 来自手机 中级黑马 2014-4-7 21:54:06
地板
Peach2014 发表于 2014-4-7 10:14
当执行到A.join()方法时,一定会等待A线程执行完才会回到主线程来执行。如果想要让主线程活,就只能等到A ...

怎样调用interrupted()主线程都停了,在哪里调用?
回复 使用道具 举报
join就是抢夺运行权,当有线程用这方法时,当前运行的线程就会自动放弃运行权,陷入冷冻状态。然后别的线程开始运行,直到调用join方法的线程的代码运行完了结束了。才会唤醒刚才被冷冻的线程
回复 使用道具 举报
join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了join的用法。
回复 使用道具 举报
  1. //join用法展示

  2. package mythread;  

  3. public class JoinThread extends Thread  
  4. {  
  5.     public static int n = 0;  

  6.     static synchronized void inc()  
  7.     {  
  8.         n++;  
  9.     }   
  10.   public void run()  
  11.     {  
  12.         for (int i = 0; i < 10; i++)  
  13.             try
  14.             {  
  15.                 inc();  
  16.                 sleep(3);  // 为了使运行结果更随机,延迟3毫秒  
  17.                   
  18.             }  
  19.             catch (Exception e)  
  20.             {  
  21.             }                                       
  22.     }  
  23.     public static void main(String[] args) throws Exception  
  24.     {  
  25.      
  26.         Thread threads[] = new Thread[100];  
  27.         for (int i = 0; i < threads.length; i++)  // 建立100个线程  
  28.             threads[i] = new JoinThread();  
  29.         for (int i = 0; i < threads.length; i++)   // 运行刚才建立的100个线程  
  30.             threads[i].start();  
  31.         if (args.length > 0)   
  32.             for (int i = 0; i < threads.length; i++)   // 100个线程都执行完后继续  
  33.                 threads[i].join();  
  34.         System.out.println("n=" + JoinThread.n);  
  35.     }  
  36. }  
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马