Java 等待多个子线程 join

本文详细介绍了Java中线程的Join方法的使用方法及其作用。通过具体实例展示了如何利用Join方法实现主线程等待子线程执行完毕后再继续执行的场景。
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

t.join();      //使调用线程 t 在此之前执行完毕。

t.join(1000);  //等待 t 线程,等待时间是1000毫秒


要想主线程main等待若干线程结束之后再执行,需要先调用各个子线程的start()方法,在所有线程的start()方法执行完之后,再执行所有子线程的join()方法。若依次执行每个线程的start()和join()方法,则各个线程之间是同步的。举例如下:

public class Test {
	
	public static void main(String[] args) {
		Thread cpuThread = new Thread(new Runnable(){		//线程1,去获取cpu利用率
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("1 over");
			}
		});
		
		Thread memThread = new Thread(new Runnable(){		//线程2,去获取mem利用率
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2 over");			
			}
		});
		
		Thread netThread = new Thread(new Runnable(){		//线程3,去获取net利用率
			@Override
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("3 over");
			}
		});
		
		
		try {
			cpuThread.start();
			memThread.start();
			netThread.start();

			cpuThread.join();
			memThread.join();
			netThread.join();
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("都结束了");
		
	}
}


参考:

http://uule.iteye.com/blog/1101994

http://blog.youkuaiyun.com/xiao__gui/article/details/9213413

### Java中创建和管理多个线程Java中,可以通过种方式创建和管理多个线程。以下是两种常见的方法:继承`Thread`类和实现`Runnable`接口。 #### 方法一:继承`Thread`类 通过扩展`java.lang.Thread`类来创建线程,每个线程对象都有一个`run`方法,该方法定义了线程执行的任务[^1]。下面是一个示例代码: ```java class MyThread extends Thread { public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " - " + i); } } } public class MultiThreadExample { public static void main(String[] args) { for (int i = 0; i < 3; i++) { MyThread thread = new MyThread(); thread.start(); // 启动线程 } } } ``` 这种方法的局限性在于单继承的问题,因为Java不支持继承,如果一个类已经继承了其他类,则无法再继承`Thread`类[^2]。 #### 方法二:实现`Runnable`接口 通过实现`Runnable`接口,可以避免单继承的限制,同时也可以将任务逻辑与线程分离[^2]。以下是一个示例代码: ```java class MyRunnable implements Runnable { public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " - " + i); } } } public class MultiThreadExample { public static void main(String[] args) { for (int i = 0; i < 3; i++) { Thread thread = new Thread(new MyRunnable()); thread.start(); // 启动线程 } } } ``` #### 管理多个线程 为了更好地管理多个线程,可以使用`join`方法等待所有子线程完成后再继续主线程的执行[^3]。此外,还可以使用线程池来优化线程的创建和销毁过程。以下是一个使用`join`方法的示例: ```java public class MultiThreadJoinExample { public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[3]; for (int i = 0; i < 3; i++) { threads[i] = new Thread(new MyRunnable()); threads[i].start(); } for (Thread thread : threads) { thread.join(); // 等待每个线程完成 } System.out.println("All threads have finished."); } } ``` #### 使用线程池管理线程 从JDK 1.5开始,引入了`ExecutorService`接口和`ThreadPoolExecutor`类来简化线程管理[^3]。以下是一个使用线程池的示例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); for (int i = 0; i < 5; i++) { Runnable worker = new MyRunnable(); executor.execute(worker); // 提交任务到线程池 } executor.shutdown(); // 关闭线程池 } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值