随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

Java多线程初学者指南(5):join方法的使用

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java多线程初学者指南(4):线程的生命周期

    在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了join的用法。
package mythread;

public class JoinThread extends Thread
{
    
public static int n = 0;

    
static synchronized void inc()
    {
        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();
        
if (args.length > 0)  
            
for (int i = 0; i < threads.length; i++)   // 100个线程都执行完后继续
                threads[i].join();
        System.out.println(
"n=" + JoinThread.n);
    }
}

在例程2-8中建立了100个线程,每个线程使静态变量n增加10。如果在这100个线程都执行完后输出n,这个n值应该是1000

1.  测试1

使用如下的命令运行上面程序:

java mythread.JoinThread

程序的运行结果如下:

n=442

这个运行结果可能在不同的运行环境下有一些差异,但一般n不会等于1000。从上面的结果可以肯定,这100个线程并未都执行完就将n输出了。

2.  测试2

使用如下的命令运行上面的代码:

    在上面的命令行中有一个参数join,其实在命令行中可以使用任何参数,只要有一个参数就可以,这里使用join,只是为了表明要使用join方法使这100个线程同步执行。

程序的运行结果如下:

n=1000

   无论在什么样的运行环境下运行上面的命令,都会得到相同的结果:n=1000。这充分说明了这100个线程肯定是都执行完了,因此,n一定会等于1000

下一篇:
Java多线程初学者指南(6):慎重使用volatile关键字





Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2009-03-12 09:07 银河使者 阅读(5958) 评论(14)  编辑  收藏 所属分类: java 原创多线程

评论

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

学习了。
2009-03-12 11:03 | 免费打电话

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

感谢博主的分享
2009-03-12 11:04 | 数据库审计

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

我曾经也想学JAVA来着,但学不会。哈哈。
2009-03-12 11:06 | 同志会所

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

在我这里运行测试二的时候结果不是1000
997,993的样子
2009-03-12 23:36 | fwy

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

@fwy
我测试了一下,这个volatile关键字好象不能真正的同步,看来得使用synchronized关键字了,程序改了一下,加了synchronized 关键字,这回结果一定是1000。
2009-03-13 08:33 | 银河使者

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

昨天这个程序我也看了很久,是在没想明白为什么声明了n是volatile但是最后计算结果就是少那么几个数,基本50%几率都不会是1000
2009-03-13 18:26 | fwy

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

@fwy
我现在用的是jdk6,这个程序是很久以前写的,用的是jdk1.4,当时测的时候好象是对的,不会是jdk的原因吧!晕,谁知道是怎么回事,请跟贴。
2009-03-13 19:24 | 银河使者

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

就是public static int n = 0;加上volatile关键字为什么还不能同步?
2009-03-13 19:25 | 银河使者

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

@fwy
研究了一个volatile,知道为什么会不同步了,详见下面的文章:
Java多线程初学者指南(6):慎重使用volatile关键字
http://www.blogjava.net/nokiaguy/archive/2009/03/14/259733.html
2009-03-14 16:48 | 银河使者

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

个人觉得作者没有深入线程的底层去说明问题
2009-03-16 13:23 | guming123416

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

@guming123416
哈哈,这是初学者指南,并没有讲得太深,如果想深入研究,可以反编译.class文件生成bytecode,一目了然!
本文只给出了结果而已!
2009-03-16 13:51 | 银河使者

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

为啥我执行join的结果都在1949以上?
2014-03-28 17:58 | yuanyuan

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

博主,终于找到原创出处了。。。转载的基本都是错的!
2014-03-28 18:04 | yuanyuan

# re: Java多线程初学者指南(5):join方法的使用  回复  更多评论   

测试二的命令怎么看不到
2014-05-29 23:30 | swew

只有注册用户登录后才能发表评论。


网站导航: