线程合并

线程合并

合并是指将指定的某个线程加入到当前线程中,合并为一个线程,由先前的两个线程交替执行变成一个线程中的两个子线程按顺序执行。

通过调用join方法来实现合并,具体如何合并?

线程甲和线程乙,线程甲执行到某个时间点的时候调用线程乙的join方法,则表示从当前时间点开始CPU资源被线程乙独占,线程甲进入阻塞状态,直到线程乙执行完毕,线程甲才进入就绪状态,等待获取CPU资源进而进入运行状态。

join方法重载:

join方法表示乙线程执行完毕之后才能执行其他线程,join(long millis)表示乙线程执行设定的毫秒之后,无论是否执行完毕,其他先都可以和它争夺CPU资源。

在这里插入图片描述

package com.mie.test;

public class JoinRunnable1 implements Runnable{

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(i+"------joinrunnable1");
		}
	}

}

package com.mie.test;

public class JoinTest {
	public static void main(String[] args) {
        /**
		 * 两个线程,主线程、join线程
		 * 主线程的逻辑:当i==10,join线程合并到主线程中
		 */
		JoinRunnable1 joinRunnable1=new JoinRunnable1();
		Thread thread=new Thread(joinRunnable1);
		thread.start();
		for (int i = 0; i < 100; i++) {
			if (i==10) {
				try {
					thread.join();//当i==10,join线程合并到主线程中
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(i+"main+++++++");
		}
	}
	
	

}

测试结果:可以看到是两个线程交替执行的。

在这里插入图片描述

使用重载方法即调用join(long millis)含参数的方法后:

package com.mie.test;

public class JoinRunnable2 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 20; i++) {
			try {
				Thread.sleep(1000);//为了更好地看到测试结果,每输出一次之前休眠一秒
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(i+"-----------joinrunnable2");
		}
	}

}

package com.mie.test;

public class JoinTest2 {
	public static void main(String[] args) {
		JoinRunnable2 joinRunnable2=new JoinRunnable2();
		Thread thread2=new Thread(joinRunnable2);
		thread2.start();
		for (int i = 0; i < 100; i++) {
			if (i==10) {
				try {
					thread2.join(3000);//当i==10的时候,CPU资源被线程JoinRunnable2独占3秒,
					//3秒结束之后,两个线程开始争夺CPU资源。
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(i+"main+++++++");
		}
	}

}

测试结果:i=0到i=9两个开始争夺CPU资源,但是从i=10开始,线程JoinRunnable2独占CPU资源执行3秒,3秒之后,两个线程继续争夺CPU资源直到两个线程都执行完毕。
在这里插入图片描述


版权声明:本文为weixin_45101989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。