大家是不是對執行緒池的技術還是不夠明白啦?相信看完後大家會有不一樣的體驗!!!
那麼這個時候怎麼辦呢?執行緒池技術就能很好的處理他,他預先建立了若干數量的執行緒,並非不能由使用者直接對執行緒的建立進行控制,在這個前提下重複的使用固定或較為固定數目的執行緒來完成任務的執行.這樣做的好處是,一方面,消除了頻繁建立和消亡執行緒的系統資源開銷,另一方面,面對過量的提交能夠平緩的劣化.
接下來我們看看如果寫乙個簡單的執行緒池介面
/**
* @author bxf
* @function 執行緒池的介面定義
* @date 2018-5-10 10:13:26
* */
public inte***ce threadpool
到這裡我們的執行緒池的介面定義好了
那他的作用呢? 客戶端可以通過execute(job job)方法將job提交到執行緒池,而客戶端自身不用等待job的執行完成.除了execute(job job)方法外,執行緒池介面提供了增大/減少工作者執行緒以及關閉執行緒池的方法.這裡工作者執行緒代表著乙個重複執行job的執行緒,而每個由客戶端提交的job都將進入到乙個工作佇列中等待工作者執行緒的處理.
那麼我們來看下實現**
/**
* @author bxf
* @function 執行緒池實現
* @date 2018-5-10 11:16:17
* */
public class defaultthreadpool implements threadpool
public defaultthreadpool(int num)
@override
public void execute(job job)
} } @override
public void shutdown()
}@override
public void addworkers(int num)
initalizeworkers(num);
this.workernum += num;
} } @override
public void removeworker(int num)
//按照給定的數量停止worker
int count = 0;
while(count < num)
}this.workernum -= count;
} } @override
public int getjobsize()
//初始化
private void initalizeworkers(int num) }
//工作者消費任務
class worker implements runnablecatch(interruptedexception ex)
}//取出job
job = jobs.removefirst();
}if(job != null)catch(exception ex) }}
}public void shutdown()
}}
從執行緒池的實現可以看到,當客戶端呼叫excute(job)方法時,會不斷的向任務列表jsos中新增job,而每個工作者執行緒會不斷地從jobs上取出乙個job進行執行,當jobs為空時,工作執行緒進入等待狀態.
新增乙個job後,對工作佇列jobs呼叫了其notify()方法,而不是notifyall方法,因為能夠確定有工作者執行緒被喚醒,這時候使用notify()方法會比notifyall方法獲得更小的開銷(避免將等待佇列中的執行緒全部移動到阻塞佇列中).
可以看到,執行緒池的本質就是使用了乙個執行緒安全得工作佇列連線工作者執行緒和客戶端執行緒,客戶端執行緒將任務放入工作佇列後便返回,而工作者執行緒則不斷的從工作佇列上取出工作並執行.當工作隊列為空時,所有的工作者執行緒均等待在工作佇列上,當有客戶端提交了乙個任務之後會通知任意乙個工作者執行緒,隨著大量的任務被提交,更多的工作者執行緒會被喚醒.
如有不足請大家指點!!!
簡單的執行緒池
開始看執行緒池感覺十分懵逼,什麼任務,任務對列,不知道是什麼東西。但是在網上找了一篇注釋詳細一點的 仔細看看一遍,就慢慢清楚他大概是個什麼,大概是怎麼實現的。一邊看一遍加注釋,會幫助你理解。下面是我當時參考的一篇部落格,有乙個執行緒池 比較簡單清晰。include include include 鎖...
簡單的執行緒池
執行緒池就是執行緒的一種使用模式。雖然執行緒是輕量級的程序,但是執行緒的建立和銷毀還是會引發效率問題。並且,如果建立的執行緒過多,反而會增加很多的排程開銷,影響系統效率。執行緒池就是可以提前建立好一些執行緒,在我們需要使用執行緒的時候,對已經建立好的執行緒新增任務就好。這裡我寫的這個執行緒池的原理如...
執行緒池的構造方法和執行緒池池工作佇列
執行緒池的構造方法 threadpoolexecutor int corepoolsize 核心執行緒數 int maximumpoolsize 最大執行緒數 long keepalivetime 空閒執行緒休眠時間 timeuint uint 時間單元 blockingqueueworkqueue...