Java中等待线程执行完毕
来源:互联网 发布:基本编程 编辑:程序博客网 时间:2024/06/07 02:50
前言:前一段时间在做项目的时候,某段代码中用到了多线程,该处代码需要开启多个线程,待这几个线程执行完毕后再接着执行后续的流程。现将可采用的方法记录如下。
要达到上述的描述的情形,可以使用Thread的join()方法,也可以使用java.util.concurrent包中的CountDownLatch类。具体如下:
一、使用Thread.join()方法
该方法在JDK API中的解释为“等待该线程终止”,存在三个方法重载,如下:
void join();
void join(long millis); // 等待该线程终止的最长时间为millis毫秒
void join(long millis, int nanos); // 等待该线程终止的最长时间为millis毫秒+nanos纳秒
代码如下:
package threadTest;import java.util.Vector;import java.util.concurrent.*;/** * Created by worm0527 on 2017/7/17. */public class ThreadTest extends Thread { // 线程名称 private String threadName; // 线程休眠时间 private int sleepSec; ThreadTest(String threadName, int sleepSec) { super(threadName); this.sleepSec = sleepSec; start();// 在构造方法中启动线程 } @Override public void run() { long starttime = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + " running..."); try { // 休眠制定时间(单位:秒) TimeUnit.SECONDS.sleep(sleepSec); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " run at " + (System.currentTimeMillis() - starttime) + " ms"); } public static void main(String[] args) throws InterruptedException { long starttime = System.currentTimeMillis(); System.out.println("Thread main running..."); Vector<Thread> threadVector = new Vector<Thread>(); for (int i = 1; i < 5; i++) { // 开启四个线程 Thread t = new ThreadTest("Thread" + i, i); threadVector.add(t); } for (Thread t : threadVector) { // 循环调用线程join()方法,等待线程结束 t.join(); } System.out.println("Thread main End"); System.out.println("Thread main run at " + (System.currentTimeMillis() - starttime) + " ms"); }}
运行结果:
二、使用CountDownLatch类
主要使用了该类的await()和countDown()两个方法。await()阻塞线程,直到计数器归零或者线程被中断,调用countDown()来递减计数器。
代码如下:
package threadTest;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;/** * Created by worm0527 on 2017/7/18. */public class ThreadTest1 extends Thread { // 线程名称 private String threadName; // 线程休眠时间 private int sleepSec; private CountDownLatch latch; // 线程类中持有CountDownLatch对象的引用 public ThreadTest1(String threadName, int sleepSec, CountDownLatch latch) { super(threadName); this.sleepSec = sleepSec; this.latch = latch; start();// 在构造方法中启动线程 } @Override public void run() { long starttime = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + " running..."); try { // 休眠制定时间(单位:秒) TimeUnit.SECONDS.sleep(sleepSec); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " run at " + (System.currentTimeMillis() - starttime) + " ms"); latch.countDown(); } public static void main(String[] args) throws InterruptedException { long starttime = System.currentTimeMillis(); System.out.println("Thread main running..."); CountDownLatch latch = new CountDownLatch(4); // 共四个子线程 for (int i = 1; i < 5; i++) { new ThreadTest1("Thread" + i, i, latch); } latch.await(); // 阻塞,直到线程计数归零 System.out.println("Thread main End"); System.out.println("Thread main run at " + (System.currentTimeMillis() - starttime) + " ms"); }}
运行结果:
1 0
- Java中等待线程执行完毕
- shell中等待其他程序执行完毕
- java中等待所有线程都执行结束
- Java中等待所有线程都执行结束
- Java中等待提交线程池的所有线程执行完成
- java 等待线程/线程池执行完毕
- Java 判断线程池 执行完毕
- java 等待所有线程执行完毕
- Java等待多个线程执行完毕
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- c# Task多线程并行任务中等待所有线程都执行完成
- 线程等待执行完毕
- JAVA主线程等待子线程执行完毕再执行
- java子线程全部执行完毕执行主线程代码
- 在GUI中等待子线程结束
- Java主线程等待子线程执行完毕-CountDownLatch
- Java主线程等待子线程执行完毕-CountDownLatch
- Java如何判断线程池所有任务是否执行完毕
- odoo10 工作流属性介绍
- ofbiz中定时任务的一个重复执行的问题
- 序
- 在网站内建立地图(百度地图)
- Python基本语法
- Java中等待线程执行完毕
- LeetCode : Third Maximum Number
- Java Web开发7___通过数据库连接池连接MySQL 数据库
- window安装 Dubbo 注册中心(Zookeeper-3.4.6)
- 算法分析与设计第十一周:416. Partition Equal Subset Sum
- 如何解决复制来的js以及css等文件中文乱码问题
- linux套接字编程笔记(二)--简单的TCP套接字应用程序
- 安装系统(win7篇)新手专用
- 成为JavaGC专家(1)—深入浅出Java垃圾回收机制