java并发:Thread中的join方法

join()方法用于等待调用该方法的线程完成执行。当一个线程调用另一个线程的join()方法时,它会暂停自己的执行,直到被调用的线程完成执行才会继续执行。

join()方法特点:

  1. 等待线程完成:调用join()方法的线程会等待被调用的线程完成执行。这在需要等待其他线程完成某个任务后再继续执行的情况下非常有用。

  2. 同步操作:通过join()方法,可以实现线程的同步操作。主线程可以调用子线程的join()方法,确保子线程在完成后再继续执行主线程的后续操作。

  3. 协调线程顺序:通过多次调用join()方法,可以协调多个线程的执行顺序,确保它们按照特定的顺序执行。

  4. 异常处理:如果被调用的线程抛出了未捕获的异常,调用它的线程可以通过捕获该异常来处理或做出相应的操作。

 实例1

三个线程T1,T2,T3, 如何保证顺序执行?

 

可以用线程类的 join() 方法在一个线程中启动另一 个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3 调 用T2 T2 调用 T1) ,这样 T1 就会先完成而 T3 最后完成。 实际上先启动三个线程中哪一个都行, 因为在每个线程的run 方法中用 join 方法限定了三个线程的 执行顺序。
public class JoinTest {
    // 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
    public static void main(String[] args) {
        final Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t1");
            }
        });
        final Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 引用t1线程,等待t1线程执行完
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t2");
            }
        });
        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 引用t2线程,等待t2线程执行完
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t3");
            }
        });
        t3.start();//这里三个线程的启动顺序可以任意,大家可以试下!
        t2.start();
        t1.start();
    }
}

实例2

public class JoinExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            System.out.println("Thread 1 started");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 1 completed");
        });

        Thread thread2 = new Thread(() -> {
            System.out.println("Thread 2 started");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread 2 completed");
        });

        thread1.start();
        thread2.start();

        thread1.join(); // 主线程等待thread1执行完成
        thread2.join(); // 主线程等待thread2执行完成

        System.out.println("All threads completed");
    }
}

主线程启动了两个子线程 thread1 和 thread2,然后通过调用它们的join()方法来等待它们的执行完成。最后,主线程输出 "All threads completed"。通过使用join()方法,可以保证在主线程继续执行之前,thread1 和 thread2 的任务都已经完成。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java7在并发编程方面,带来了很多令人激动的新功能,这将使你的应用程序具备更好的并行任务性能。 《Java 7并发编程实战手册》是Java 7并发编程的实战指南,介绍了Java 7并发API大部分重要而有用的机制。全书分为9章,涵盖了线程管理、线程同步、线程执行器、Fork/Join框架、并发集合、定制并发类、测试并发应用等内容。全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序。 《Java 7并发编程实战手册》适合具有一定Java编程基础的读者阅读和学习。如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程实战手册》 第1章 线程管理 1 1.1 简介 1 1.2 线程的创建和运行 2 1.3 线程信息的获取和设置 5 1.4 线程的断 9 1.5 线程断的控制 11 1.6 线程的休眠和恢复 15 1.7 等待线程的终止 17 1.8 守护线程的创建和运行 20 1.9 线程不可控异常的处理 24 1.10 线程局部变量的使用 26 1.11 线程的分组 30 1.12 线程组不可控异常的处理 34 1.13 使用工厂类创建线程 37 第2章 线程同步基础 41 2.1 简介 41 2.2 使用synchronized实现同步方法 42 2.3 使用非依赖属性实现同步 47 2.4 在同步代码使用条件 53 2.5 使用锁实现同步 57 2.6 使用读写锁实现同步数据访问 61 2.7 修改锁的公平性 65 2.8 在锁使用多条件(Multiple Condition) 69 第3章 线程同步辅助类 77 3.1 简介 77 3.2 资源的并发访问控制 78 3.3 资源的多副本的并发访问控制 83 3.4 等待多个并发事件的完成 87 3.5 在集合点的同步 91 3.6 并发阶段任务的运行 100 3.7 并发阶段任务的阶段切换 109 3.8 并发任务间的数据交换 115 第4章 线程执行器 120 4.1 简介 120 4.2 创建线程执行器 121 4.3 创建固定大小的线程执行器 126 4.4 在执行器执行任务并返回结果 129 4.5 运行多个任务并处理第一个结果 134 4.6 运行多个任务并处理所有结果 139 4.7 在执行器延时执行任务 144 4.8 在执行器周期性执行任务 147 4.9 在执行器取消任务 151 4.10 在执行器控制任务的完成 154 4.11 在执行器分离任务的启动与结果的处理 158 4.12 处理在执行器被拒绝的任务 164 第5章 Fork/Join框架 168 5.1 简介 168 5.2 创建Fork/Join线程池 170 5.3 合并任务的结果 178 5.4 异步运行任务 187 5.5 在任务抛出异常 194 5.6 取消任务 199 第6章 并发集合 206 6.1 简介 206 6.2 使用非阻塞式线程安全列表 207 6.3 使用阻塞式线程安全列表 212 6.4 使用按优先级排序的阻塞式线程安全列表 215 6.5 使用带有延迟元素的线程安全列表 221 6.6 使用线程安全可遍历映射 226 6.7 生成并发随机数 231 6.8 使用原子变量 233 6.9 使用原子数组 237 第7章 定制并发类 242 7.1 简介 242 7.2 定制ThreadPoolExecutor类 243 7.3 实现基于优先级的Executor类 248 7.4 实现ThreadFactory接口生成定制线程 252 7.5 在Executor对象使用ThreadFactory 257 7.6 定制运行在定时线程池的任务 259 7.7 通过实现ThreadFactory接口为Fork/Join框架生成定制线程 267 7.8 定制运行在Fork/Join框架的任务 273 7.9 实现定制Lock类 278 7.10 实现基于优先级的传输队列 284 7.11 实现自己的原子对象 294 第8章 测试并发应用程序 300 8.1 简介 300 8.2 监控Lock接口 301 8.3 监控Phaser类 305 8.4 监控执行器框架 309 8.5 监控Fork/Join池 312 8.6 输出高效的日志信息 317 8.7 使用FindBugs分析并发代码 323 8.8 配置Eclipse调试并发代码 327 8.9 配置NetBeans调试并发代码 330 8.10 使用MultithreadedTC测试并发代码 335
第一章 Java 并发编程实践基础..............................................................1 1.1 进程与线程...................................................................................................................2 1.1.1 进程...................................................................................................................2 1.1.2 线程...................................................................................................................6 1.2 创建多线程...................................................................................................................7 1.2.1 继承Thread 创建线程.....................................................................................8 1.2.2 实现Runnable 接口创建线程..........................................................................8 1.2.3 线程池...............................................................................................................9 1.3 线程的基本控制.........................................................................................................12 1.3.1 使用Sleep 暂停执行......................................................................................13 1.3.2 使用join 等待另外一个线程结束.................................................................13 1.3.3 使用断(Interrupt)取消线程........................................................................15 1.3.4 使用Stop 终止线程........................................................................................18 1.3.5 结束程序的执行.............................................................................................19 1.4 并发编程实践简述.....................................................................................................19 第二章 构建线程安全应用程序.................................................................1 2.1. 什么是线程安全性...........................................................................................................2 2.2. Servlet的线程安全性.......................................................................................................5 2.3. 同步与互斥.......................................................................................................................9 2.3.1 线程干扰...............................................................................................................9 2.3.2 同步.....................................................................................................................11 2.4. 同步与volatile.................................................................................................................13 2.5. 活性 ................................................................................................................................14 2.6. ThreadLocal变量............................................................................................................15 2.7. 高级并发对象.................................................................................................................19

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值