java 線程join的時候,是如何被notify的

Join 方法:本質上仍是根據wait方法實現的。分析join源碼發現join方法自己是使用了synchronized修飾符的。是加在方法上面的,意味着。獲取了當前對象的鎖,而後繼續發現裏面的代碼調用了wait。意味着咱們先鎖,再釋放,等待喚醒,什麼狀況下被喚醒呢:java

 

 

仔細查看join的源碼,發現調用了wait(0),讓程序等待,那麼什麼時間鎖被釋放呢?。由於是以線程對象做爲鎖的:ide

After run() finishes, notify() is called by the Thread subsystem.線程

 

當線程運行結束的時候,notify是被線程的子系統調用的code

 

分別以普通對象和線程對象做爲鎖,當使用線程對象做爲所得時候,若是鎖對象執行完畢了。wait就會中止等待繼續執行對象

 

package com.famous.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
	public static void main(String[] args) {

		final MyLockThread o = new MyLockThread();

		//final Object oo = new Object();
		new Thread(new Runnable() {

			@Override
			public void run() {
				synchronized (o) {
					System.err.println(1);
					try {
						o.wait(0);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.err.println(2);
				}
			}
		}).start();

		o.start();
	}

	static class MyLockThread extends Thread {

		public MyLockThread() {
		}

		@Override
		public void run() {
			System.err.println("MyLockThread");
		}

	}
}
相關文章
相關標籤/搜索