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可以低级,同级都可以有优先执行机会。