java的join()方法
對於join()方法導致當前執行緒等待,很多人想知道如何實現。但是,當看下面join原始碼的時候,覺得呼叫的是th1的wait,所以是th1等待,怎麼會是當前執行緒等待呢?
public class Main{
public static void main(String[] args) {
Thread th1 = new Thread("1"){
public void run(){
//
}
};
th1.start();
th1.join();
}
}
請仔細看下面原始碼.其實造成當前執行緒等待是因為上面while(isAlive())迴圈,while結束就執行當前執行緒,但每次th1還活著就會呼叫wait(0),意思是釋放鎖0秒後喚醒自己。所以th1執行緒看似wait了,實際上是不斷的wait->runnable的過程。可以看出,join操作也是釋放鎖的。
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);//
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
join方法會是當前執行緒進入waiting狀態
public class ThreadSample{
public static void main(String... arg) {
Thread th1 = new Thread("1"){
public void run(){
Thread th2 = new Thread("2"){
public void run(){
while(true){
}
}
};
th2.start();
try {
th2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
th1.start();
}
}
相關文章
- java基礎:執行緒方法之joinJava執行緒
- Java執行緒中yield與join方法的區別Java執行緒
- Java Fork/Join 框架Java框架
- 【原創】Java多執行緒初學者指南(5):join方法的使用Java執行緒
- Java通過join方法來暫停當前執行緒Java執行緒
- join、inner join、left join、right join、outer join的區別
- Java併發 -- Fork/Join框架Java框架
- sql中的join、left join、right joinSQL
- Java Thread的join() 之刨根問底Javathread
- java多執行緒基礎篇(wait、notify、join、sleep、yeild方法)Java執行緒AI
- Mysql join 的本質,Nested Loop Join 和 Hash JoinMySqlOOP
- sql的left join 、right join 、inner join之間的區別SQL
- mysql中的left join、right join 、inner join的詳細用法MySql
- sql之left join、right join、inner join的區別SQL
- hash join\nest loop join\sort merge join的實驗OOP
- join方法應用之—查詢航班資訊
- Join方法把陣列轉為字串陣列字串
- left join,right join,inner join的條件on和where的區別
- ZT:簡單介紹join,outer-join,semi-join,anti-join的區別
- MySQL LEFT JOIN/ INNER JOIN/RIGHT JOINMySql
- join()方法的神奇用處與Intern機制的軟肋
- Java多執行緒之join()的使用初學習Java執行緒
- Java之 join 等待執行緒終止Java執行緒
- java多執行緒wait notify joinJava執行緒AI
- 重做一道Java面試題(Fork/Join)Java面試題
- oracle的left join,right join和full join的一點介紹(R1)Oracle
- Inner Join, Left Outer Join和Association的區別
- HASH JOIN ,MERGE JOIN ,NESTED LOOP的比較OOP
- 【FULL OUTER JOIN】全外連線的union all改寫方法
- Java執行緒(十一):Fork/Join-Java平行計算框架Java執行緒框架
- MySQL JOIN的使用MySql
- MySQL的Join使用MySql
- 對Join的理解
- mysql left join轉inner joinMySql
- Java併發6:阻塞佇列,Fork/Join框架Java佇列框架
- SQL中的Filter, join, semi-join等概念的釋義SQLFilter
- .join()
- Thread執行緒控制之sleep、join、setDaemon方法的用處thread執行緒