- 等待线程结束:jion()
- 谦让: yeild()
- 睡眠: sleep()
jion和sleep和yeild之间有什么区别呢?
首先介绍一下jion():
如果想让主线程等待子线程执行完毕之后再继续运行,比如线程处理一个数据,主线程想要获得这个线程的处理结果,因为线程之间是并行的,这个时候就需要用到jion()方法。方向jion()的作用就是等待线程对象销毁。
先来看一段示例代码:
public class MyThread extends Thread { @Override public void run(){ try{ int value = (int) (Math.random()*1000); System.out.println("i will sleep for "+value+" ms"); Thread.sleep(value); }catch (InterruptedException e){ e.printStackTrace(); } } } public class Test { public static void main(String[] args) { try{ MyThread thread = new MyThread(); thread.start(); thread.join(); System.out.println("我想在上面的线程执行结束只会再执行,我成功了!"); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("================分割线====================="); MyThread myThread = new MyThread(); myThread.start(); System.out.println("我也想在上面的线程执行完毕之后执行!"); System.out.println("但是我不知道应该sleep多久啊!"); System.out.println("i failed..."); } }
放上执行结果:
i will sleep for 436 ms 我想在上面的线程执行结束只会再执行,我成功了! ================分割线===================== 我也想在上面的线程执行完毕之后执行! 但是我不知道应该sleep多久啊! i failed... i will sleep for 936 ms
这里介绍一下join()的原理,方法jion()具有使线程排队运行的作用,有些类似同步的运行效果。jion和synchronized的区别是:join在内部使用wait()方法进行等待,而synchronized关键字使用对象监视器原理作为同步。
划重点,因为join()使用了wait()所以,join是释放锁的!是释放锁的!
这是join和sleep的主要区别!
然后介绍一下yeild()
yeild()就是简单让线程让出cpu资源,所以yeid()只是一种谦让的方法,因为是谦让,所以他可以刚谦让过,立马就又恢复运行,但是!!!yeild不会释放对象锁!!!!
package page_7; public class ThreadYieldAndSleepTest implements Runnable { private int count = 0;// 系统访问次数 @Override public synchronized void run() {// 通过synchronized实现同步 count++; try { if (count == 1) { /// <注>. sleep 和 yield 都不会释放 <锁资源>。 Thread.yield(); } } catch (Exception e) { // TODO: handle exception } System.out.println(Thread.currentThread().getName() + "线程: " + "第" + count + "位访客来啦!"); } public static void main(String[] args) { ThreadYieldAndSleepTest rd = new ThreadYieldAndSleepTest(); for (int i = 1; i <= 50; i++) { Thread thread = new Thread(rd, String.valueOf(i)); thread.start(); } } }
运行结果为:
1线程: 第1位访客来啦!
50线程: 第2位访客来啦!
49线程: 第3位访客来啦!
48线程: 第4位访客来啦!
47线程: 第5位访客来啦!
......
没有被抢占,所以yeild()不会释放锁!
最后介绍一下sleep
sleep的介绍很多,sleep是不会释放锁的
总结
sleep和yeild 一样不会释放锁
join 会释放锁
sleep和join如果不考虑对象锁的情况下,功能基本一致