Ⅰ java線程池
java常用的線程池有三種:
1.
newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads)創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。如果在所有線程處於活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那麼一個新線程將代替它執行後續的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。
參數:
nThreads - 池中的線程數
返回:
新創建的線程池
拋出:
IllegalArgumentException - 如果 nThreads <= 0
2.
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor()創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。
返回:
新創建的單線程 Executor
3.
newCachedThreadPool
public static ExecutorService newCachedThreadPool()創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對於執行很多短期非同步任務的程序而言,這些線程池通常可提高程序性能。調用 execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鍾未被使用的線程。因此,長時間保持空閑的線程池不會使用任何資源。注意,可以使用 ThreadPoolExecutor 構造方法創建具有類似屬性但細節不同(例如超時參數)的線程池。
返回:
新創建的線程池
Ⅱ Java線程狀態中BLOCKED和WAITING有什麼區別
Java線程狀態中BLOCKED和WAITING有什麼區別
新建狀態(New) 新創建了一個線程對象。
就緒狀態(Runnable) 線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。
運行狀態(Running) 就緒狀態的線程獲取了CPU,執行程序代碼。
阻塞狀態(Blocked) 阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池中。
其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把
Ⅲ java線程wait方法
wait和notify是用在多線程競爭同一鎖資源的情況下使用的。
你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。
你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下
publicclassA
{
publicA(){
finalAa=this;
Threadth1=newThread(){
@Override
publicvoidrun(){
//一直循環,去嘗試著喚醒a
try
{
this.sleep(10000);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//為檢查是不是能真正實現喚醒a,等待10000毫秒,此時保證a已經處於等待狀態中。
while(true){
/**
*用notify喚醒的線程必須是持有當前鎖對象的線程
*/
synchronized(a){
a.notify();
}
}
}
};
th1.setDaemon(true);//這句也是必須的,將th1設為守護線程,保證在喚醒a以後,所有活動的線程都為守護線程,jvm能及時推出
th1.start();//和a.run的順序不可以換
this.run();
}
publicstaticvoidmain(String[]args)
{
newA();
}
publicvoidrun()
{
/**
*這里可以換成這樣,直接鎖住this就行了
*/
synchronized(this)
{
try
{
this.wait();//阻塞當前的線程
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
System.out.println("1");//執行finally
}
}
}
}
Ⅳ java怎樣將多個線程放入到一個對象等待池中
TaskQueue Extends Queue
{
object taskLock = null ;
Runnable Dequeue ()
{
synchronized (taskLock)
{
while (getCount () <= 0)
{
taskLock.Wait () ;
}
return super.dequeue () ;
}
}
void Enqueue (Runnable runObject)
{
synchronized (taskLock)
{
super.enqueue (runObject) ;
taskLock.NotifyAll () ;
}
}
}
Ⅳ java如何創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。求代碼
packagetest;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
{
publicstaticvoidmain(String[]args){
=Executors.newFixedThreadPool(3);
for(inti=0;i<10;i++){
finalintindex=i;
fixedThreadPool.execute(newRunnable(){
publicvoidrun(){
try{
System.out.println(index);
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
}
}
}
因為線程池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。
定長線程池的大小最好根據系統資源進行設置。如Runtime.getRuntime().availableProcessors()
Ⅵ java 中1、一個線程調用了wait(),隨後被notify()喚醒,這個線程會接著執行wait
1、如果一個線程調用了某個對象的wait方法,那麼該線程進入到該對象的等待池中(並且已經將鎖釋放),
如果未來的某一時刻,另外一個線程調用了相同對象的notify方法或者notifyAll方法,
那麼該等待池中的線程就會被喚起,然後進入到對象的鎖池裡面去獲得該對象的鎖,
如果獲得鎖成功後,那麼該線程就會沿著wait方法之後的路徑繼續執行。注意是沿著wait方法之後
2.如果沒有直接性的調用同類里的其他介面,或者返回,結束等java關鍵字,代碼還是得往下執行的。
Ⅶ 如何等待java線程池中所有任務完成
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String args[]) throws InterruptedException {
ExecutorService exe = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 5; i++) {
exe.execute(new SubThread(i));
}
exe.shutdown();
while (true) {
if (exe.isTerminated()) {
System.out.println("結束了!");
break;
}
Thread.sleep(200);
}
}
}
Ⅷ 詳談Java幾種線程池類型介紹及使用方法
線程池作用就是限制系統中執行線程的數量。
根據系統的環境情況,可以自動或手動設置線程數量,達到運行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程 排隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待進程,線程池的這一資源處於等待。當一個新任務需要運行時,如果線程 池中有等待的工作線程,就可以開始運行了;否則進入等待隊列。
Java裡面線程池的頂級介面是Executor,但是嚴格意義上講Executor並不是一個線程池,而只是一個執行線程的工具。真正的線程池介面是ExecutorService。ThreadPoolExecutor是Executors類的底層實現。
Ⅸ java多線程相互等待
1、存在處以業務邏輯類,存在map,初始化。
2、存在線程池 最大200,ThreadFactory可以默認
3、單線程處理ip的類,構造方法包含是需參數Map,
4、外部循環 調用線程池,生成線程 傳參 map 和當前循環次數
5、線程處理完ip後,將外部傳來的循環次數做key,結果做value插入map,喚醒主線程判斷map中的數量是否==需處理的ip的數量,選擇跳出或繼續等待。
Ⅹ java 如果wait中的線程競爭不到鎖是否重新進入wait等待池還是鎖等待池
wait中的線程是不會去競爭對象鎖的。
據我所知,開始由於調用了對象的wait方法,線程處於該對象的等待池中,
而後,只有再去調用對象的notifyAll()(喚醒所有等待池中的線程)或者notify()(隨機喚醒線程,姑且假設喚醒了我們的那個線程),線程會進入該對象的鎖池之中。
鎖池中的對象相互競爭對象鎖,優先順序高的線程競爭得到對象鎖的概率高,假若線程沒有競爭到,它還是會在鎖池之中,唯有線程再次調用wait方法,它才會重新回到等待池中。
希望對你有幫助。