首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

多线程join如何用

2012-06-30 
多线程join怎么用join,说白了就是让本来异步执行的多线程变成同步执行的。?这么说比较抽象,不太好理解,我们

多线程join怎么用

join,说白了就是让本来异步执行的多线程变成同步执行的。

?

这么说比较抽象,不太好理解,我们举个例子如下:

?

package mythread;   public class JoinThread extends Thread  {      public static int n = 0;       static synchronized void inc()      {              n++;          System.out.println("当前活动线程和N分别为:"+Thread.currentThread().getName()+"_"+n);    }      public void run()      {          for (int i = 0; i < 10; i++)              try             {                  inc();                 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[i] = new JoinThread();          for (int i = 0; i < threads.length; i++){// 运行刚才建立的100个线程          threads[i].start();        System.out.println("线程"+i+"start了");        threads[i].join();//关键点        }                System.out.println("n=" + JoinThread.n);          }    }  

这段代码,放在eclipse中运行一下,看看就会发现其中的端倪了。

?在代码中,我作了个标记“关键点”。

大家可以分别将这句话注释和打开时,发现n输入的值是不一样的。

如果不用join(),那么n打出来每次都不一样,有可能是300,有可能是180,反正不可能是1000。

而加入Join后必然是1000。

那么这是为什么呢?

原来大家要知道线程与线程是竞争的关系,当main函数创建了一个第一个线程后,它就开始和main所在的线程进行竞争(即抢占对CPU的控制权)。谁也不服输。

? 如果线程1竞争成功,那么他就是去将n++,他想去循环10遍,可是main不会让它这么轻松,通过观察此程序运行结果就可以看出,线程1的10次是被分散了很多次才完成的,毕竟当线程创建越多,线程1的竞争能力就越差。

? 如果是main竞争成功,那么他就会去创建线程2,线程2创建成功后,又同时与线程1和main竞争。

? 这样当main创建完第100个线程后,此时100个线程正在打架,谁了不服谁。每个线程的10次都没有全部完成。

? 此时,如果我们强行打印出N的值,肯定是远远小于1000的。

? 而如果我们刚创建完一个线程就让它Join后,那么就相当于有警察在旁边执勤了。

? main线程不准抢线程1的CPU控制权,等线程1运行结束后,再让main创建线程2。

? 这样就有条不紊了。

?

1 楼 wzt7576 2012-06-04   线程1的10次是被分散了很多次才完成的,



你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊

热点排行