黑马程序员技术交流社区

标题: 多线程join怎么用,怎么用了没效果 [打印本页]

作者: 程金    时间: 2012-10-1 17:27
标题: 多线程join怎么用,怎么用了没效果
本帖最后由 程金 于 2012-10-2 12:10 编辑

package test;

public class Test extends Thread
{
    public static volatile int n = 0;

    public  void run()
    {
        for (int i = 0; i < 10; i++, n++)
            try
            {
                sleep(3);  // 为了使运行结果更随机,延迟3毫秒
            }
            catch (Exception e)
            {
            }                                      
    }
    public static void main(String[] args) throws Exception
    {
        Thread threads[] = new Thread[100];
        for (int i = 0; i < threads.length; i++)  // 建立100个线程
            threads = new Test();
        for (int i = 0; i < threads.length; i++)   // 运行刚才建立的100个线程
            threads.start();
        if (args.length > 0)  
            for (int i = 0; i < threads.length; i++)   // 100个线程都执行完后继续
                threads.join();
//不是说join的线程都执行完了,才向下执行吗,为什么结果n输出的都小于1000

        System.out.println("n=" + Test.n);
    }
}

作者: 古银平    时间: 2012-10-1 18:17
  1. public class Test3 extends Thread
  2. {
  3.      public static volatile int n = 0;

  4.     public  void run()
  5.      {
  6.          for (int i = 0; i < 10; i++, n++)
  7.              try
  8.              {
  9.                  sleep(3);  // 为了使运行结果更随机,延迟3毫秒
  10.              }
  11.              catch (Exception e)
  12.              {
  13.              }                                      
  14.      }
  15.      public static void main(String[] args) throws Exception
  16.      {
  17.          Thread threads[] = new Thread[100];
  18.          for (int i = 0; i < threads.length; i++)  // 建立100个线程
  19.              threads[i] = new Test3();
  20.          for (int i = 0; i < threads.length; i++)   // 运行刚才建立的100个线程
  21.              threads[i].start();
  22.          if (args.length > 0)  
  23.              for (int i = 0; i < threads.length; i++)   //100线程都是用join方法,
  24.                  threads[i].join();
  25. //不是说join的线程都执行完了,才向下执行吗,为什么结果n输出的都小于1000
  26. /*
  27. public final void join()
  28.                 throws InterruptedException等待该线程终止。

  29. 抛出:
  30. InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。



  31.    因为sleep()了,所以当前中断状态被清除,main线程继续执行,还因为建立了10个线程,每个线程中
  32.    都有一个n,初始为0,也就是说没有共享数据,所以输出的Test3.n的值不会超过100。main线程执行完了,
  33.    但创建的线程还没执行完,所以输出的永远都小于等于100。
  34.    

  35.   */
  36.         System.out.println("n=" + Test3.n);
  37.      }
  38. }
复制代码
public final void join()
                throws InterruptedException等待该线程终止。

抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。

   因为sleep()了,所以当前中断状态被清除,main线程继续执行,还因为建立了10个线程,每个线程中
   都有一个n,初始为0,也就是说没有共享数据,所以输出的Test3.n的值不会超过100。main线程执行完了,
   但创建的线程还没执行完,所以输出的永远都小于等于100。





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