Thread中的join sleep yield wait notify方法的使用

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

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

看一下一个demo:

[java]  view plain  copy
  1. /** 
  2.  * join方法可以用于临时加入线程,一个线程在运算过程中,如果满足于条件, 
  3.  * 我们可以临时加入一个线程,让这个线程运算完,另外一个线程再继续运行。 
  4.  * @author leo-zeng 
  5.  * 
  6.  */  
  7. public class JoinTest {  
  8.     public static void main(String[] args) throws Exception {  
  9.         ThreadTest test  =new ThreadTest();  
  10.         ThreadTest test2  =new ThreadTest();  
  11.         test.setName("one");  
  12.         test2.setName("two");  
  13.         Thread t1 = new Thread(test);  
  14.         Thread t2 = new Thread(test2);  
  15.         t1.start();  
  16.         /** 
  17.          * 主线程向下转时,碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权。 
  18.          * 这时候CPU执行权在主线程手里,主线程就把CPU执行权给放开,陷入冻结状态。 
  19.          * 活着的只有t1了,只有当t1拿着执行权把这些数据都打印完了,主线程才恢复到运行中来 
  20.          */  
  21.         //join 方法 确保 t1执行之后 执行t2  
  22.         t1.join();  
  23.         t2.start();  
  24.           
  25.     }  
  26. }  
  27. class ThreadTest implements Runnable{  
  28.       
  29.     private String name;  
  30.       
  31.     public void setName(String name) {  
  32.         this.name = name;  
  33.     }  
  34.     public String getName() {  
  35.         return name;  
  36.     }  
  37.     @Override  
  38.     public void run() {  
  39.         for (int i = 0; i < 5; i++) {  
  40.                 System.out.println(this.getName()+"------"+i);  
  41.         }  
  42.     }  
  43.       
  44. }  
运行结果:

one------0
one------1
one------2
one------3
one------4
two------0
two------1
two------2
two------3
two------4

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

2.看下sleep、yield方法:

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

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

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

看以下两个demo

[java]  view plain  copy
  1. public class YieldTest {  
  2.       
  3.     public static void main(String[] args) {  
  4.         ThreadTest2 test1 = new ThreadTest2();  
  5.         test1.setName("one");  
  6.         ThreadTest2 test2 = new ThreadTest2();  
  7.         test2.setName("two");  
  8.         Thread t1 =new Thread(test1);  
  9.         Thread t2 =new Thread(test2);  
  10.         t1.setPriority(Thread.MAX_PRIORITY);  
  11.         t2.setPriority(Thread.MIN_PRIORITY);  
  12.         t1.start();  
  13.         t2.start();       
  14.     }  
  15. }  
  16. class ThreadTest2 implements Runnable{  
  17.       
  18.     private String name;  
  19.       
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.       
  27.     @Override  
  28.     public void run() {  
  29.           
  30.         for (int i = 0; i <10; i++) {  
  31.             Thread.yield();  
  32.             System.out.println(this.getName()+"------"+i);  
  33.         };  
  34.           
  35.     }  
  36.       
  37. }  
如果不用yield()方法的话,两个线程应该是交替进行的,用了yield()之后,cpu会多交出一些时间给ti优先执行。

[java]  view plain  copy
  1.  */  
  2. public class SleepTest {  
  3.     public static void main(String[] args) {  
  4.         ThreadTest3 test2 = new ThreadTest3();  
  5.         ThreadTest3 test3 = new ThreadTest3();  
  6.         Thread t1 =new Thread(test2);  
  7.         Thread t2 =new Thread(test3);  
  8.             t1.setPriority(Thread.MAX_PRIORITY);//设置最高级别  
  9.             t2.setPriority(Thread.MIN_PRIORITY);//设置最低级别  
  10.             t1.start();  
  11.             t2.start();       
  12.     }  
  13. }  
  14.   
  15. class ThreadTest3 implements Runnable{  
  16.   
  17.     @Override  
  18.     public void run() {  
  19.           
  20.         for (int i = 0; i <10; i++) {  
  21.             try {  
  22.                 Thread.sleep(100);  
  23.                 System.out.println(Thread.currentThread().getName()+"------"+i);  
  24.             } catch (InterruptedException e) {  
  25.                   
  26.                 e.printStackTrace();  
  27.             }  
  28.               
  29.         };  
  30.           
  31.     }  
  32. }  
使用sleep的话,随机性就大一些。

3.wait(),notify()方法

顺便说下Object 类的wait()方法和notify()方法,注意这个不是Thread类的方法;还有这两个方法主要是操作锁标志的,所以只能在synchronized方法或者synchronized block中

使用;wait()方法在睡眠的时候会放开锁,给其他的线程使用。wait()有两种方式获得锁:1.wait(longtimeout),通过设定时间来获得锁,值得注意的是,timeout这个时间到了以后,它不会立即醒来,而是要看那个正在使用这把锁的线程是否结束。2.通过notify()的方法,通知需要这把锁的wait(),使之唤醒,还有wait 方法也要和sleep方法区别,上面说到sleep方法是不释放锁资源的。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leonardo9029/article/details/46343289
想对作者说点什么?  我来说一句
  • qiangju9473
    qiangju9473 2018-01-13 15:53:38 #3楼
    感觉lz对join方法的理解有偏差。还是希望看看其他人的blog,综合一下。
  • sunqichang2012
    sunqichang2012 2017-10-18 18:35:21 #2楼
    碰到了t1.join(),t1要申请加入到运行中来,就是要CPU执行权 --&gt; 你确定这句话正确?
查看 7 条热评
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值