码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础复习(2) 多线程相关 sleep() yield() wait() join()等方法简略说明

时间:2015-10-23 11:58:27      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

2015-10-23

今天回顾的是多线程的部分,对于线程编程常用的几个方法稍作整理和区分。

1.join方法

(之前总是记的迷迷糊糊,重新看了一遍,算是基本理清了orz)

  join方法属于线程,意思是把指定线程加入到当前线程执行序列,可以让本来是交替执行的两个线程合并成顺序执行的线程。例如:同时执行线程thread-A和线程thread-B,此时在线程thread-B中调用线程thread-A的join()方法,结果就是直到线程thread-A执行完毕,线程thread-B才继续执行。

  使用:

    thread.join(); //这里调用线程thread执行完毕后,才继续执行之后的语句

    或

    thread.join(millis); //等待thread线程执行结束,等待时间自定,时间结束或者thread线程结束,才继续执行之后语句

注:join方法内部是通过Object提供的wait方法实现的。这就意味着要实现thread.join,则必须能够拿到线程对象thread的对象锁。否则,thread.join(millis)等待的时间可能无法预估。(附上join()的代码)

技术分享
 1 /**
 2  * Waits at most <code>millis</code> milliseconds for this thread to  
 3  * die. A timeout of <code>0</code> means to wait forever.    
 4  */
 5 
 6 public final synchronized void join(long millis)    throws InterruptedException {
 7     long base = System.currentTimeMillis();
 8     long now = 0;
 9 
10     if (millis < 0) {
11         throw new IllegalArgumentException("timeout value is negative");
12     }
13     
14     if (millis == 0) {
15         while (isAlive()) {
16             wait(0);
17         }
18     } else {
19         while (isAlive()) {
20             long delay = millis - now;
21             if (delay <= 0) {
22                 break;
23             }
24             wait(delay);
25             now = System.currentTimeMillis() - base;
26         }
27     }
28 }
join()的实现


2.sleep方法

  Thread.sleep(millis)方法是线程类的静态方法,作用是强制使当前执行的线程(调用该方法的线程)暂停执行一段时间,并交出CPU占有权。暂停时间结束后,返回到可运行状态。

  sleep是静态方法,调用本地方法来实现,针对的是当调用Thread.sleep(millis)方法的线程。

 

  作用:可以使低优先级的线程得到执行的机会。

注:

  ①sleep(millis)到期后会自动苏醒,返回可运行状态,而不是运行状态。即是说,sleep方法不能保证线程睡眠到期后就立马开始执行;

  ②线程执行sleep方法并不释放对象锁,如果有syncronized同步块,那么其他线程仍然不能访问共享数据。

 

3.yeild方法

  Thread.yield()方法也是线程类的静态方法,作用是暂停当前正在执行的线程对象(运行状态-->可运行状态),并执行其它同优先级线程。目的是让具有相同优先级的其它线程获得运行机会,让同优先级的线程之间能适当的轮转执行。

  yield()方法对应如下操作:先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程。即是,yield()只能使同优先级的线程有执行的机会。

  但是,实际使用中无法保证yield()能达到让步目的,因为让步的线程很可能被线程调度程序再次选中。

 

4.wait()和sleep()

①wait()、notify()、notifyAll()都是Object类的方法,用于协调多个线程共享数据的存取,必须在synchronized语句块内使用。

  void wait(),导致当前线程进入等待,用在其它线程调用此对象的notify()方法或者notifyAll()方法前。wait()后,线程会释放掉它所占有的"对象锁",从而使线程所在对象中的其它synchronized数据可被别的线程使用。

  wait()方法关联notify()/notifyAll()方法,因为会对对象的锁标志进行操作,所以他们必须在synchronized函数或者代码块中进行调用。否则,运行时会发生IllegleMonitorStateException异常。

②sleep()、yield()是Thread类的方法。

  sleep(millis)使当前线程进入停滞状态,不会释放对象锁。

 

join方法更详细的理解:http://uule.iteye.com/blog/1101994 

Java基础复习(2) 多线程相关 sleep() yield() wait() join()等方法简略说明

标签:

原文地址:http://www.cnblogs.com/xiaomi1992/p/4903857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!