Java基础多线程之线程同步(主线程等待子线程结束)

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(1295)   2023-03-28 11:29:14

引言

  随着互联网时代的发展。在Java编程中多线程来处理多任务降低任务响应时间已是一种趋势。这里主要讲解Java多线程入门的主线程等待子线程结束的几种方法。

一.通过线程的join()方法

通过join()方法来实现主线程等待子线程同步的例子如下
首先编写一个简单的测试用的线程类:
 
package xqlee.net.project.demo.thread.waitchilds;

public class ThreadChildOne extends Thread {


	public ThreadChildOne(String name) {
		super(name);
	}

	@Override
	public void run() {
		try {
			long time=1000 * ((int) (Math.random() * 10));
			System.out.println("From Child:" + this.getName()+">>>Start["+time+"]");
			sleep(time);
			System.out.println("From Child:" + this.getName()+">>>End");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
这里通过继承Thread来编写的一个线程类。

编写一个测试类来实现:
package xqlee.net.project.demo.thread.waitchilds;

import java.util.ArrayList;
import java.util.List;

public class TestWaitChildsOne {

	public static void main(String[] args) {

		try {
			System.out.println("From Main Thread:==>Start");
			System.out.println("From Main Thread:开始调用子线程----》");
			long start = System.currentTimeMillis();
			List<ThreadChildOne> list = new ArrayList<>();
			for (int i = 0; i < 6; i++) {
				ThreadChildOne threadChild = new ThreadChildOne("Child-" + i);
				threadChild.start();
				list.add(threadChild);
			}

			for (ThreadChildOne threadChild : list) {
				threadChild.join();
			}
			System.out.println("From Main Thread:子线程调用结束,耗时:" + (System.currentTimeMillis() - start));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

执行测试类,观察控制台如下图:
通过join()实现线程同步的运行结果
从上图我们可以看到成功的实现了主线程等待子线程同步。观察这里比最大子线程耗时多了3毫秒,可能是因为CPU切换线程耗时属于正常现象。
 

二.通过JDK自带的工具类CountDownLatch来实现多线程的线程同步

编写一个简单的测试线程类:
package xqlee.net.project.demo.thread.waitchilds;

import java.util.concurrent.CountDownLatch;

public class ThreadChildTwo extends Thread {
	private CountDownLatch countDownLatch;

	public ThreadChildTwo(String name, CountDownLatch countDownLatch) {
		super(name);
		this.countDownLatch = countDownLatch;
	}

	@Override
	public void run() {
		try {
			long time = 1000 * ((int) (Math.random() * 10));
			System.out.println("From Child:" + this.getName() + ">>>Start[" + time + "]");
			sleep(time);
			System.out.println("From Child:" + this.getName() + ">>>End");

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 倒数器减1
			countDownLatch.countDown();
		}
	}
}

测试类:
package xqlee.net.project.demo.thread.waitchilds;

import java.util.concurrent.CountDownLatch;

public class TestWaitChildsTwo {

	public static void main(String[] args) {
		try {// 创建一个初始值为5的倒数计数器  
	        CountDownLatch countDownLatch = new CountDownLatch(5);  //这里的数字=线程数+1
			System.out.println("From Main Thread:==>Start");
			System.out.println("From Main Thread:开始调用子线程----》");
			long start = System.currentTimeMillis();
			for (int i = 0; i < 5; i++) {
				ThreadChildTwo threadChild = new ThreadChildTwo("Child-" + i,countDownLatch);
				threadChild.start();
			}
			  // 阻塞当前线程,直到倒数计数器倒数到0  
            countDownLatch.await();  
        	System.out.println("From Main Thread:子线程调用结束,耗时:" + (System.currentTimeMillis() - start));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

运行结果:
测试运行结果
地址:https://www.leftso.com/article/334.html

相关阅读

Java基础多线程之主线程等待子线程结束,Java基础编程之多线程入门学习篇。主要讲解几种方法来实现Java多线程中主线程等待子线程结束的最快方式。
java多线程编程_java多线程安全_java多线程实现安全锁CAS机制,CAS在java多线程中相当于数据库的乐观锁,synchronized相当于数据库的乐观锁。
线程安全是像Java这样的语言/平台中的类的重要质量,我们经常在线程之间共享对象。由于缺乏线程安全性而导致的问题非常难以调试,因为它们零星且几乎不可能有意再现。你如何测试你的对象以确保它们是线程...
Java多线程生命周期
本文将讲述排队锁的使用场景,什么情况适合使用排队锁?Java 怎么使用排队锁?
本文将讲述CLH锁的使用场景,什么情况适合使用CLH锁?Java 怎么使用CLH锁?
本文将讲述什么是自旋锁?自旋锁的使用场景,什么情况适合使用自旋锁?Java 怎么使用自旋锁?
本文将讲述MCS锁的使用场景,什么情况适合使用MCS锁?Java 怎么使用MCS锁?