标签:
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 }
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