1、生產者消費者問題
wait() 必須在synchronized 函式或者**塊裡面
wait()會讓已經獲得synchronized 函式或者**塊控制權的thread暫時休息,並且喪失控制權
這個時候,由於該執行緒喪失控制權並且進入等待,其他執行緒就能取得控制權,並且在適當情況下呼叫notifyall()來喚醒wait()的執行緒。
需要注意的是,被喚醒的執行緒由於已經喪失了控制權,所以需要等待喚醒它的執行緒結束操作,從而才能重新獲得控制權。
所以wait()的確是馬上讓當前執行緒喪失控制權,其他的執行緒可以乘虛而入。
此例中:
當產品倉庫滿的時候,生產者執行緒需要wait(),從而放棄對產品倉庫的控制。
這個時候消費者執行緒就可以進來了而取得倉庫的控制權。一旦消費者消費了產品,那麼倉庫就不滿了。
這個時候消費者執行緒就要notifyall()生產者執行緒,讓等待的生產者執行緒喚醒。
但是生產者被喚醒後不能馬上進行生產,因為它在wait()的時候已經喪失了對倉庫的控制權,所以就需要等待消費者執行緒結束操作,
才能重新取得倉庫的控制權,再進行生產。
所以特別注意的是,notifyall()並不是讓當前執行緒馬上讓出控制權,而只是讓其他wait()當中的執行緒喚醒而已,
所以對不起,儘管我喚醒你,可你必須還是要等我用完倉庫才能進來。這點必須清楚。
相反,倉庫如果空的時候,消費者執行緒就會wait(),然後等待生產者執行緒來生產產品,生產者程序乘虛而入後,讓生產者執行緒生產產品
並且喚醒消費者執行緒。這個情況跟上面就類似了。
package threadproblems;
public class producerconsumer
}class producer implements runnable
public void run() catch (interruptedexception e)
} }}class consumer implements runnable
public void run() catch (interruptedexception e)
} }}class basket catch (interruptedexception e)
} this.notify();
index--;
system.out.println("編號: " + basket[index] + " 被消費");
return basket[index];
} public synchronized void push(int i) catch (interruptedexception e)
} this.notify();
basket[index] = i;
system.out.println("編號: " + i + " 被生產");
index++;
}}
2、造乙個死鎖的程式
package threadproblems;
public class testdeadlock implements runnable catch (interruptedexception e)
synchronized (o2)
}} if (flag == 2) catch (interruptedexception e)
synchronized (o1)
}} }
public static void main(string args)
}
3、使用三個執行緒列印分別列印a、b、c 10次 保持abc的順序不變
package threadproblems;
public class printabctentimes
}class printer implements runnable
public void run() else catch (interruptedexception e) }}
}} }
}
java多執行緒問題
一提到多執行緒,大家都會想到多執行緒的實現方式之類的一些東西,但是僅僅是知道這些,下面給大家分享一道常見面試題,理解了這道題,那應該會對多執行緒更加深一些了解。問題 子執行緒執行10次,主線程執行10次,然後子執行緒執行10次,主線程執行10次,迴圈20次,寫出程式 大概就是這樣的。package ...
java中線程問題
24.09 多執行緒 獲取名字和設定名字 掌握 1.獲取名字 通過getname 方法獲取執行緒物件的名字 2.設定名字 通過建構函式可以傳入string型別的名字 new thread start new thread yyy start 通過setname string 方法可以設定執行緒物件的...
java多執行緒問題,執行緒交替執行
兩個執行緒,乙個列印1 100的奇數,乙個列印1 100的偶數 要求 執行緒1列印5個之後,執行緒2開始列印,執行緒2列印5個之後,執行緒1再開始列印,以此迴圈。package threadtest public class test1 catch interruptedexception e 當s...