黑马程序员技术交流社区

标题: 关于join方法的问题 [打印本页]

作者: 许鑫星    时间: 2013-2-26 12:50
标题: 关于join方法的问题
本帖最后由 许鑫星 于 2013-2-27 12:31 编辑
  1.         private static double count = 0;

  2.         public static void init() throws InterruptedException {
  3.                 synchronized (ThreadTest.class) {
  4.                         Thread.currentThread().join();//这个方法的作用是?
  5.                         System.out.println(Thread.currentThread().getName() + "....."
  6.                                         + count);
  7.                         count++;
  8.                 }
  9.         }
  10.         public static void main(String[] args) throws Exception {
  11.                 for (int i = 0; i <= 1000; i++) {
  12.                         new Thread() {
  13.                                 public void run() {
  14.                                         try {
  15.                                                 init();
  16.                                         } catch (InterruptedException e) {
  17.                                                 e.printStackTrace();
  18.                                         }        
  19.                                 };
  20.                         }.start();
  21.                 }
  22.                 System.out
  23.                                 .println("......................................................."
  24.                                                 + count);
  25.         }
复制代码
我在上面调用join方法想让循环先执行再执行主线程,为什么会导致除主线程意外的所有线程都执行不了?
作者: 刘凯    时间: 2013-2-26 13:18
Join()方法是
当A线程执行到了 B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。

楼主的Thread.currentThread().join();  是当前线程调用自己的join()方法
那么当前线程就会等待 ,等待着自己执行结束, 貌似这样就死锁了
而 join()并不是主函数调用的 所以主线程并不等待 所以可继续执行
所以就会出现导致除主线程意外的所有线程都执行不了  

个人见解  请指正

作者: 杜鹏飞    时间: 2013-2-26 13:51
本帖最后由 Pf_D 于 2013-2-26 14:01 编辑

首先楼主的问题已经出现了错误。
“我在上面调用join方法想让循环先执行再执行主线程”,主线程一定是先于其它线程而执行的。在并行程序中,只有主线程创建其它线程后,可能会产生其它线程与主线程并发执行的情况。
JDK documention对java.lang中的Thread中的join方法是这样解释的

public final void join()
                throws InterruptedException
Waits for this thread to die. 等待直到“该”线程被杀死。(这个“该”指的是哪个线程呢?this字面意思理解起来好像是包含该语句的线程,即主调线程,其实不然,主调线程会等待调用join的线程执行直到其死亡或抛出被中断执行的异常。在这段时间内,主调线程阻塞)
An invocation of this method behaves in exactly the same way as the invocation

join(0)

Throws:
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
因此,2L的回答并不完全正确。

作者: 付玉光    时间: 2013-2-26 14:48

// join()方法:表如果在一个线程对象上调用join方法,那么当前线程将等待这个线程对象对应的线程结束.

//Thread.currentThread().join();表示本线程将等待,等待自己的线程结束,而自己的线程也就是本线程,产生了死锁。

//for循环就在主线程中执行的,主线程new了一个Thread子类对象并调用start方法后,就创建了一

//Thread-0线程,假设此时Thread-0获得CPU的执行权,执行到run方法中的Thread.currentThread().join();时,就生产了死锁。

//所以,主线程每创建一个线程,这个线程执行到这就都会等。

//如果你想让主线程也等待的话,那么你就把该句(Thread.currentThread().join();)加到主函数中,就能实现。

class ThreadTest{
        private static double count = 0;
        public static void init() throws InterruptedException {
                synchronized (ThreadTest.class) {
      //System.out.println(Thread.currentThread().getName() + "....ccccc."+ count);
                        Thread.currentThread().join();//这个方法的作用是?
                        System.out.println(Thread.currentThread().getName() + "....."+ count);
                        count++;
                }
        }
        public static void main(String[] args) throws Exception {
                for (int i = 0; i <= 1000; i++) {
                        new Thread() {
       public void run() {
         try {
           init();
         } catch (InterruptedException e) {
           e.printStackTrace();
         }        
       };
                        }.start();
                }
    Thread.currentThread().join();
    System.out.println("......................................................."+ count);
        }
}
//希望对你有帮助。{:soso_e100:}


作者: 许鑫星    时间: 2013-2-26 18:33
Pf_D 发表于 2013-2-26 13:51
首先楼主的问题已经出现了错误。
“我在上面调用join方法想让循环先执行再执行主线程”,主线程一定是先于 ...

呃,我的意思其实是在创建完所有线程之后再继续执行主函数。
也就是说只能够在主函数中调用其他线程的join方法来优先执行,如果在线程中调用实际上是主函数在调用join。
那么岂不是没有办法在这种匿名的线程内调用像join这样的方法
作者: 刘凯    时间: 2013-2-26 19:01
Pf_D 发表于 2013-2-26 13:51
首先楼主的问题已经出现了错误。
“我在上面调用join方法想让循环先执行再执行主线程”,主线程一定是先于 ...

Thread.currentThread().join();  这一句中的Thread.currentThread()就是被调用join的线程啊 , 而且Thread.currentThread() 这个返回的是自己,那岂不是类似死锁了  自己等自己死或自己抛出被中断执行的异常   我的意思是和3楼的意思一样的  ,  才疏学浅 ,望指正哪里有问题,   小弟英文不太好 ,可否弄些API1.6中文版的来啊 。。。
作者: 刘凯    时间: 2013-2-26 19:07
许鑫星 发表于 2013-2-26 18:33
呃,我的意思其实是在创建完所有线程之后再继续执行主函数。
也就是说只能够在主函数中调用其他线程的joi ...

小弟认为 楼主可以讲创建线程  也就是主函数中的for{}  方法到一个线程里去  然后创建该线程 并执行 然后将该线程 .join了   这样应该改就能得到楼主想要的效果了
作者: 杜鹏飞    时间: 2013-2-26 20:24
刘凯 发表于 2013-2-26 19:01
Thread.currentThread().join();  这一句中的Thread.currentThread()就是被调用join的线程啊 , 而且Thre ...

我没有正面解释楼主的问题,只是说了下method join的用法,sorry。
作者: 陈丽莉    时间: 2013-2-27 09:20
许鑫星 发表于 2013-2-26 18:33
呃,我的意思其实是在创建完所有线程之后再继续执行主函数。
也就是说只能够在主函数中调用其他线程的joi ...


.join()方法,调用的是其他线程,感觉你有些弄混了。匿名线程内是可以调用join方法的,但调用的线程不能是匿名的。




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