黑马程序员技术交流社区

标题: 线程问题 [打印本页]

作者: 湛添友    时间: 2014-4-6 23:49
标题: 线程问题
对join()的用法不理解!  若A线程等待了,前面那个线程是不是也跟着挂了
作者: Peach2014    时间: 2014-4-6 23:54
能说清楚点吗?
作者: 湛添友    时间: 2014-4-7 00:33
Peach2014 发表于 2014-4-6 23:54
能说清楚点吗?

比如有主线程和A线程,然后调用A.join()再让A进入被wait   这样是不是主线程也挂了,有何方法让主线程活过来?
作者: ╰つ    时间: 2014-4-7 09:55
如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
所以你的A不可能被wait,一中断就抛一个异常,然后再把你的中断清除
作者: Peach2014    时间: 2014-4-7 10:14
本帖最后由 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
Peach2014 发表于 2014-4-7 10:14
当执行到A.join()方法时,一定会等待A线程执行完才会回到主线程来执行。如果想要让主线程活,就只能等到A ...

怎样调用interrupted()主线程都停了,在哪里调用?
作者: 杨殿生    时间: 2014-4-8 17:45
join就是抢夺运行权,当有线程用这方法时,当前运行的线程就会自动放弃运行权,陷入冷冻状态。然后别的线程开始运行,直到调用join方法的线程的代码运行完了结束了。才会唤醒刚才被冷冻的线程
作者: 为梦想而活着    时间: 2014-4-8 19:29
join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了join的用法。
作者: 为梦想而活着    时间: 2014-4-8 19:30
  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. }  
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2