thread 中的join() 的用法

1:首先来说说线程Thread的join方法:

顾名思义就是往线程中添加东西;该方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件,我们可以临时加入一个线程,让这个线程运算完成,另外一个线程在继续运行。

/**
 * join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件,
 * 我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。
 *
 */
public class test {
	public static void main(String[] args) throws Exception {
		ThreadTest test  =new ThreadTest();
		ThreadTest test2  =new ThreadTest();
		test.setName("one");
		test2.setName("two");
		Thread t1 = new Thread(test);
		Thread t2 = new Thread(test2);
		t1.start();
		/**
		 * 主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。
		 * 这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。
		 * 活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来
		 */
		//join 方法 确保 t1执行之后 执行t2
		t1.join();
		t2.start();
		
	}
}
class ThreadTest implements Runnable{
	
	private String name;
	
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
				System.out.println(this.getName()+"------"+i);
		}
	}
	
}

线程向下转时,碰到了 t1.join() , t1要申请加入到运行中来,就是要CPU执行权。这时候CPU执行权在主线程手里,主线程把CPU执行权给放开,陷入冻结状态。活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来;这就是调用join方法的用法。:

2:看下sleep和yield方法

Thread.yield方法暂停当前正在执行的线程对象,并执行其他线程。也就是交出CPU一段时间(其他同样的优先级或者更高优先级的线程可以获取到运行的机会)不会释放锁资源。

而Thread.sleep()方法使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行,同时sleep函数不会释放锁资源;sleep可使优先级低的线程得到执行的机会,当然也可以让同样优先级和高优先级的线程有执行的机会。

这两个的区别在于yield只能是同级,或者高级优先执行,而sleep可以低级,同级都可以有优先执行机会。

猜你喜欢

转载自blog.csdn.net/weixin_39027589/article/details/81215929