導航:首頁 > 編程語言 > java線程池實現

java線程池實現

發布時間:2023-07-29 10:10:22

java線程池怎麼實現的

線程池簡介:

多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。


假設一個伺服器完成一項任務所需時間為:T1 創建線程時間,T2 在線程中執行任務的時間,T3 銷毀線程時間。

如果:T1 + T3 遠大於 T2,則可以採用線程池,以提高伺服器性能。

一個線程池包括以下四個基本組成部分:

1、線程池管理器(ThreadPool):用於創建並管理線程池,包括 創建線程池,銷毀線程池,添加新任務;

2、工作線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可以循環的執行任務;

3、任務介面(Task):每個任務必須實現的介面,以供工作線程調度任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;

4、任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩沖機制。

線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高伺服器程序性能的。它把T1,T3分別安排在伺服器程序的啟動和結束的時間段或者一些空閑的時間段,這樣在伺服器程序處理客戶請求時,不會有T1,T3的開銷了。

線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目,看一個例子:

假設一個伺服器一天要處理50000個請求,並且每個請求需要一個單獨的線程完成。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目,而如果伺服器不利用線程池來處理這些請求則線程總數為50000。一般線程池大小是遠小於50000。所以利用線程池的伺服器程序不會為了創建50000而在處理請求時浪費時間,從而提高效率。

代碼實現中並沒有實現任務介面,而是把Runnable對象加入到線程池管理器(ThreadPool),然後剩下的事情就由線程池管理器(ThreadPool)來完成了

packagemine.util.thread;

importjava.util.LinkedList;
importjava.util.List;

/**
*線程池類,線程管理器:創建線程,執行任務,銷毀線程,獲取線程基本信息
*/
publicfinalclassThreadPool{
//線程池中默認線程的個數為5
privatestaticintworker_num=5;
//工作線程
privateWorkThread[]workThrads;
//未處理的任務
_task=0;
//任務隊列,作為一個緩沖,List線程不安全
privateList<Runnable>taskQueue=newLinkedList<Runnable>();
;

//創建具有默認線程個數的線程池
privateThreadPool(){
this(5);
}

//創建線程池,worker_num為線程池中工作線程的個數
privateThreadPool(intworker_num){
ThreadPool.worker_num=worker_num;
workThrads=newWorkThread[worker_num];
for(inti=0;i<worker_num;i++){
workThrads[i]=newWorkThread();
workThrads[i].start();//開啟線程池中的線程
}
}

//單態模式,獲得一個默認線程個數的線程池
(){
returngetThreadPool(ThreadPool.worker_num);
}

//單態模式,獲得一個指定線程個數的線程池,worker_num(>0)為線程池中工作線程的個數
//worker_num<=0創建默認的工作線程個數
(intworker_num1){
if(worker_num1<=0)
worker_num1=ThreadPool.worker_num;
if(threadPool==null)
threadPool=newThreadPool(worker_num1);
returnthreadPool;
}

//執行任務,其實只是把任務加入任務隊列,什麼時候執行有線程池管理器覺定
publicvoidexecute(Runnabletask){
synchronized(taskQueue){
taskQueue.add(task);
taskQueue.notify();
}
}

//批量執行任務,其實只是把任務加入任務隊列,什麼時候執行有線程池管理器覺定
publicvoidexecute(Runnable[]task){
synchronized(taskQueue){
for(Runnablet:task)
taskQueue.add(t);
taskQueue.notify();
}
}

//批量執行任務,其實只是把任務加入任務隊列,什麼時候執行有線程池管理器覺定
publicvoidexecute(List<Runnable>task){
synchronized(taskQueue){
for(Runnablet:task)
taskQueue.add(t);
taskQueue.notify();
}
}

//銷毀線程池,該方法保證在所有任務都完成的情況下才銷毀所有線程,否則等待任務完成才銷毀
publicvoiddestroy(){
while(!taskQueue.isEmpty()){//如果還有任務沒執行完成,就先睡會吧
try{
Thread.sleep(10);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
//工作線程停止工作,且置為null
for(inti=0;i<worker_num;i++){
workThrads[i].stopWorker();
workThrads[i]=null;
}
threadPool=null;
taskQueue.clear();//清空任務隊列
}

//返回工作線程的個數
publicintgetWorkThreadNumber(){
returnworker_num;
}

//返回已完成任務的個數,這里的已完成是只出了任務隊列的任務個數,可能該任務並沒有實際執行完成
(){
returnfinished_task;
}

//返回任務隊列的長度,即還沒處理的任務個數
publicintgetWaitTasknumber(){
returntaskQueue.size();
}

//覆蓋toString方法,返回線程池信息:工作線程個數和已完成任務個數
@Override
publicStringtoString(){
return"WorkThreadnumber:"+worker_num+"finishedtasknumber:"
+finished_task+"waittasknumber:"+getWaitTasknumber();
}

/**
*內部類,工作線程
*/
{
//該工作線程是否有效,用於結束該工作線程
privatebooleanisRunning=true;

/*
*關鍵所在啊,如果任務隊列不空,則取出任務執行,若任務隊列空,則等待
*/
@Override
publicvoidrun(){
Runnabler=null;
while(isRunning){//注意,若線程無效則自然結束run方法,該線程就沒用了
synchronized(taskQueue){
while(isRunning&&taskQueue.isEmpty()){//隊列為空
try{
taskQueue.wait(20);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
if(!taskQueue.isEmpty())
r=taskQueue.remove(0);//取出任務
}
if(r!=null){
r.run();//執行任務
}
finished_task++;
r=null;
}
}

//停止工作,讓該線程自然執行完run方法,自然結束
publicvoidstopWorker(){
isRunning=false;
}
}
}

Ⅱ java常用的幾種線程池實例講解

下面給你介紹4種線程池:

1、newCachedThreadPool:

2、newFixedThreadPool:


3、newSingleThreadExecutor

4、NewScheledThreadPool:

最後給你說一下線程池任務執行流程:

Ⅲ Java實現通用線程池

線程池通俗的描述就是預先創建若干空閑線程 等到需要用多線程去處理事務的時候去喚醒某些空閑線程執行處理任務 這樣就省去了頻繁創建線程的時間 因為頻 繁創建線程是要耗費大量的CPU資源的 如果一個應用程序需要頻繁地處理大量並發事務 不斷的創建銷毀線程往往會大大地降低系統的效率 這時候線程池就派 上用場了

本文旨在使用Java語言編寫一個通用的線程池 當需要使用線程池處理事務時 只需按照指定規范封裝好事務處理對象 然後用已有的線程池對象去自動選擇空 閑線程自動調用事務處理對象即可 並實現線程池的動態修改(修改當前線程數 最大線程數等) 下面是實現代碼

//ThreadTask java

package polarman threadpool;

/** *//**

*線程任務

* @author ryang

*

*/

public interface ThreadTask {

public void run();

}

//PooledThread java

package polarman threadpool;

import java util Collection; import java util Vector;

/** *//**

*接受線程池管理的線程

* @author ryang

*

*/

public class PooledThread extends Thread {

protected Vector tasks = new Vector();

protected boolean running = false;

protected boolean stopped = false;

protected boolean paused = false;

protected boolean killed = false;

private ThreadPool pool;

public PooledThread(ThreadPool pool) { this pool = pool;

}

public void putTask(ThreadTask task) { tasks add(task);

}

public void putTasks(ThreadTask[] tasks) { for(int i= ; i<tasks length; i++) this tasks add(tasks[i]);

}

public void putTasks(Collection tasks) { this tasks addAll(tasks);

}

protected ThreadTask popTask() { if(tasks size() > ) return (ThreadTask)tasks remove( );

else

return null;

}

public boolean isRunning() {

return running;

}

public void stopTasks() {

stopped = true;

}

public void stopTasksSync() {

stopTasks();

while(isRunning()) { try {

sleep( );

} catch (InterruptedException e) {

}

}

}

public void pauseTasks() {

paused = true;

}

public void pauseTasksSync() {

pauseTasks();

while(isRunning()) { try {

sleep( );

} catch (InterruptedException e) {

}

}

}

public void kill() { if(!running)

interrupt();

else

killed = true;

}

public void killSync() {

kill();

while(isAlive()) { try {

sleep( );

} catch (InterruptedException e) {

}

}

}

public synchronized void startTasks() {

running = true;

this notify();

}

public synchronized void run() { try { while(true) { if(!running || tasks size() == ) { pool notifyForIdleThread(); //System out println(Thread currentThread() getId() + : 空閑 ); this wait(); }else {

ThreadTask task;

while((task = popTask()) != null) { task run(); if(stopped) {

stopped = false;

if(tasks size() > ) { tasks clear(); System out println(Thread currentThread() getId() + : Tasks are stopped );

break;

}

}

if(paused) {

paused = false;

if(tasks size() > ) { System out println(Thread currentThread() getId() + : Tasks are paused );

break;

}

}

}

running = false;

}

if(killed) {

killed = false;

break;

}

}

}catch(InterruptedException e) {

return;

}

//System out println(Thread currentThread() getId() + : Killed );

}

}

//ThreadPool java

package polarman threadpool;

import java util Collection; import java util Iterator; import java util Vector;

/** *//**

*線程池

* @author ryang

*

*/

public class ThreadPool {

protected int maxPoolSize;

protected int initPoolSize;

protected Vector threads = new Vector();

protected boolean initialized = false;

protected boolean hasIdleThread = false;

public ThreadPool(int maxPoolSize int initPoolSize) { this maxPoolSize = maxPoolSize; this initPoolSize = initPoolSize;

}

public void init() {

initialized = true;

for(int i= ; i<initPoolSize; i++) {

PooledThread thread = new PooledThread(this);

thread start(); threads add(thread);

}

//System out println( 線程池初始化結束 線程數= + threads size() + 最大線程數= + maxPoolSize);

}

public void setMaxPoolSize(int maxPoolSize) { //System out println( 重設最大線程數 最大線程數= + maxPoolSize); this maxPoolSize = maxPoolSize;

if(maxPoolSize < getPoolSize())

setPoolSize(maxPoolSize);

}

/** *//**

*重設當前線程數

* 若需殺掉某線程 線程不會立刻殺掉 而會等到線程中的事務處理完成* 但此方法會立刻從線程池中移除該線程 不會等待事務處理結束

* @param size

*/

public void setPoolSize(int size) { if(!initialized) {

initPoolSize = size;

return;

}else if(size > getPoolSize()) { for(int i=getPoolSize(); i<size && i<maxPoolSize; i++) {

PooledThread thread = new PooledThread(this);

thread start(); threads add(thread);

}

}else if(size < getPoolSize()) { while(getPoolSize() > size) { PooledThread th = (PooledThread)threads remove( ); th kill();

}

}

//System out println( 重設線程數 線程數= + threads size());

}

public int getPoolSize() { return threads size();

}

protected void notifyForIdleThread() {

hasIdleThread = true;

}

protected boolean waitForIdleThread() {

hasIdleThread = false;

while(!hasIdleThread && getPoolSize() >= maxPoolSize) { try { Thread sleep( ); } catch (InterruptedException e) {

return false;

}

}

return true;

}

public synchronized PooledThread getIdleThread() { while(true) { for(Iterator itr=erator(); itr hasNext();) { PooledThread th = (PooledThread)itr next(); if(!th isRunning())

return th;

}

if(getPoolSize() < maxPoolSize) {

PooledThread thread = new PooledThread(this);

thread start(); threads add(thread);

return thread;

}

//System out println( 線程池已滿 等待 );

if(waitForIdleThread() == false)

return null;

}

}

public void processTask(ThreadTask task) {

PooledThread th = getIdleThread();

if(th != null) { th putTask(task); th startTasks();

}

}

public void processTasksInSingleThread(ThreadTask[] tasks) {

PooledThread th = getIdleThread();

if(th != null) { th putTasks(tasks); th startTasks();

}

}

public void processTasksInSingleThread(Collection tasks) {

PooledThread th = getIdleThread();

if(th != null) { th putTasks(tasks); th startTasks();

}

}

}

下面是線程池的測試程序

//ThreadPoolTest java

import java io BufferedReader; import java io IOException; import java io InputStreamReader;

import polarman threadpool ThreadPool; import polarman threadpool ThreadTask;

public class ThreadPoolTest {

public static void main(String[] args) { System out println( quit 退出 ); System out println( task A 啟動任務A 時長為 秒 ); System out println( size 設置當前線程池大小為 ); System out println( max 設置線程池最大線程數為 ); System out println();

final ThreadPool pool = new ThreadPool( ); pool init();

Thread cmdThread = new Thread() { public void run() {

BufferedReader reader = new BufferedReader(new InputStreamReader(System in));

while(true) { try { String line = reader readLine(); String words[] = line split( ); if(words[ ] equalsIgnoreCase( quit )) { System exit( ); }else if(words[ ] equalsIgnoreCase( size ) && words length >= ) { try { int size = Integer parseInt(words[ ]); pool setPoolSize(size); }catch(Exception e) {

}

}else if(words[ ] equalsIgnoreCase( max ) && words length >= ) { try { int max = Integer parseInt(words[ ]); pool setMaxPoolSize(max); }catch(Exception e) {

}

}else if(words[ ] equalsIgnoreCase( task ) && words length >= ) { try { int timelen = Integer parseInt(words[ ]); SimpleTask task = new SimpleTask(words[ ] timelen * ); pool processTask(task); }catch(Exception e) {

}

}

} catch (IOException e) { e printStackTrace();

}

}

}

};

cmdThread start();

/**//*

for(int i= ; i< ; i++){

SimpleTask task = new SimpleTask( Task + i (i+ )* ); pool processTask(task);

}*/

}

}

class SimpleTask implements ThreadTask {

private String taskName;

private int timeLen;

public SimpleTask(String taskName int timeLen) { this taskName = taskName; this timeLen = timeLen;

}

public void run() { System out println(Thread currentThread() getId() +

: START TASK + taskName + );

try { Thread sleep(timeLen); } catch (InterruptedException e) {

}

System out println(Thread currentThread() getId() +

: END TASK + taskName + );

}

}

使用此線程池相當簡單 下面兩行代碼初始化線程池

ThreadPool pool = new ThreadPool( ); pool init();

要處理的任務實現ThreadTask 介面即可(如測試代碼里的SimpleTask) 這個介面只有一個方法run()

兩行代碼即可調用

lishixin/Article/program/Java/hx/201311/27203

Ⅳ java線程池(一) 簡述線程池的幾種使用方式

首先說明下java線程是如何實現線程重用的
1. 線程執行完一個Runnable的run()方法後,不會被殺死
2. 當線程被重用時,這個線程會進入新Runnable對象的run()方法12

java線程池由Executors提供的幾種靜態方法創建線程池。下面通過代碼片段簡單介紹下線程池的幾種實現方式。後續會針對每個實現方式做詳細的說明
newFixedThreadPool
創建一個固定大小的線程池
添加的任務達到線程池的容量之後開始加入任務隊列開始線程重用總共開啟線程個數跟指定容量相同。
@Test
public void newFixedThreadPool() throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService = Executors.newFixedThreadPool(1, new ThreadFactoryBuilder().build());
RunThread run1 = new RunThread("run 1");
executorService.execute(run1);
executorService.shutdown();
}12345678

newSingleThreadExecutor
僅支持單線程順序處理任務
@Test
public void newSingleThreadExecutor() throws Exception {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().build());
executorService.execute(new RunThread("run 1"));
executorService.execute(new RunThread("run 2"));
executorService.shutdown();

}123456789

newCachedThreadPool
這種情況跟第一種的方式類似,不同的是這種情況線程池容量上線是Integer.MAX_VALUE 並且線程池開啟緩存60s
@Test
public void newCachedThreadPool() throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().build());
executorService.execute(new RunThread("run 1"));
executorService.execute(new RunThread("run 2"));
executorService.shutdown();

}123456789

newWorkStealingPool
支持給定的並行級別,並且可以使用多個隊列來減少爭用。
@Test
public void newWorkStealingPool() throws Exception {
ExecutorService executorService = Executors.newWorkStealingPool();
executorService = Executors.newWorkStealingPool(1);
RunThread run1 = new RunThread("run 1");
executorService.execute(run1);
executorService.shutdown();

}123456789

newScheledThreadPool
看到的現象和第一種相同,也是在線程池滿之前是新建線程,然後開始進入任務隊列,進行線程重用
支持定時周期執行任務(還沒有看完)
@Test
public void newScheledThreadPool() throws Exception {
ExecutorService executorService = Executors.newScheledThreadPool(1);
executorService = Executors.newScheledThreadPool(1, new ThreadFactoryBuilder().build());
executorService.execute(new RunThread("run 1"));
executorService.execute(new RunThread("run 2"));
executorService.shutdown();

}

Ⅳ java如何寫一個線程池(線程池大小可定義為3),

packagecn.sdeit.servlet;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
importjavax.servlet.ServletException;
importjavax.servlet.annotation.WebServlet;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importcn.sdeit.beans.Team;
importcn.sdeit.beans.User;
importcn.sdeit.mysql.ConnectMySql;
/**
*
*/
@WebServlet(name="JoinTeam",urlPatterns={"/JoinTeam"})

{
=1L;
privateStringcaptainName=null;
privateStringteamName=null;
privatePrintWriterwriter=null;
/**
*@seeHttpServlet#HttpServlet()
*/
publicJoinTeam()
{
super();
}
protectedvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException
{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");

writer=response.getWriter();

captainName=request.getParameter("name");
teamName=request.getParameter("team");

if(teamName.equals((newTeam()).getTeamNameByCaptainName(captainName)))
{
intresult=joinTeam(((User)request.getSession().getAttribute("oldUser")).getEmail());
if(result==0)
{
showErrorMessage("抱歉!</br>伺服器內部錯誤,加入隊伍失敗!請及時反饋管理員!");
}
else
{
response.sendRedirect("mine.jsp");
}
}
else
{
showErrorMessage("抱歉!</br>沒有找到符合條件的團隊!請聯系您的隊長解決,若信息無誤,且問題一直出現,請聯系管理員!");
writer.flush();
writer.close();
}
}

privatevoidshowErrorMessage(Stringerror)
{
writer.write(error);
writer.flush();
writer.close();
}

privateintjoinTeam(Stringemail)
{
intposition=(newTeam()).getMinEmptyMemberPosition(teamName);
intresult=0;
if(position==-1)
{
showErrorMessage("抱歉!</br>此小組人數已達到上限,請更換隊伍或者協商隊長調整組員結構!");
}
else
{
Connectionconnection=ConnectMySql.createConnection();
Stringsql="updateteamsetmember"+position+""+"=?wherename=?";
PreparedStatementprepared=ConnectMySql.createPreparedStatement(connection,sql);
try
{
prepared.setString(1,email);
prepared.setString(2,teamName);
result=prepared.executeUpdate();
connection.close();
prepared.close();
}catch(SQLExceptione)
{
e.printStackTrace();
}
}
returnresult;
}
}

Ⅵ java線程池怎麼實現

要想理解清楚java線程池實現原理,明白下面幾個問題就可以了:

(1):線程池存在哪些狀態,這些狀態之間是如何進行切換的呢?

(2):線程池的種類有哪些?

(3):創建線程池需要哪些參數,這些參數的具體含義是什麼?

(4):將任務添加到線程池之後運行流程?

(5):線程池是怎麼做到重用線程的呢?

(6):線程池的關閉

首先回答第一個問題:線程池存在哪些狀態;

查看ThreadPoolExecutor源碼便知曉:

[java]view plain

Ⅶ 【Java基礎】線程池的原理是什麼

什麼是線程池?

總歸為:池化技術 ---》資料庫連接池 緩存架構 緩存池 線程池 內存池,連接池,這種思想演變成緩存架構技術---> JDK設計思想有千絲萬縷的聯系

首先我們從最核心的ThreadPoolExecutor類中的方法講起,然後再講述它的實現原理,接著給出了它的使用示例,最後討論了一下如何合理配置線程池的大小。

Java 中的 ThreadPoolExecutor 類

java.uitl.concurrent.ThreadPoolExecutor 類是線程池中最核心的一個類,因此如果要透徹地了解Java 中的線程池,必須先了解這個類。下面我們來看一下 ThreadPoolExecutor 類的具體實現源碼。

在 ThreadPoolExecutor 類中提供了四個構造方法:

Ⅷ Java線程:新特徵-線程池

Sun在Java 中 對Java線程的類庫做了大量的擴展 其中線程池就是Java 的新特徵之一 除了線程池之外 還有很多多線程相關的內容 為多線程的編程帶來了極大便利 為了編寫高效穩定可靠的多線程程序 線程部分的新增內容顯得尤為重要 有關Java 線程新特徵的內容全部在ncurrent下面 裡麵包含數目眾多的介面和類 熟悉這部羨盯帶分API特徵是一項艱難的學習過程 目前有關這方面的資料和書籍都少之又少 大所屬介紹線程方面書籍還停留在java 之前的知識層面上 當然新特徵對做多線程程序沒有必須的關系 在java 之前通用可以寫出很優秀的多線程程序 只是代價不一樣而已 線程池的基本思想還是一種對象池的思想 開辟一塊內存空間 裡面存放了眾多(未死亡)的線程 池中線程執行調度由池管理器來處理 當有線程任務時 從池中取一個 執行完成後線程對象歸池 這樣可以避免反復創建線程對象所帶來的性能開銷 節省了系統的資源 在Java 之前 要實現一個線程池是相當有難度的 現在Java 為我們做好了一切 我們只需要按照提供的API來使用 即可享受線程池帶來的極大便利 則螞 Java 的線程池分好多種 固定尺寸的線程池 可變尺寸連接池 在使用線程池之前 必須知道如何去創建一個線程池 在Java 中 需要了解的是ncurrent Executors類的API 這個類提供大量創建連接池的靜態方法 是必須掌握的 一 固定大小的線程池 import ncurrent Executors; import ncurrent ExecutorService; /** * Java線程 線程池 * * @author Administrator : : */ public class Test { public static void main(String[] args) { //創建一個可重用固定線程數的線程池 ExecutorService pool = Executors newFixedThreadPool( ); //創建實現了Runnable介面對象 Thread對象當然也實現了Runnable介面 Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); 兄蘆Thread t = new MyThread(); Thread t = new MyThread(); //將線程放入池中進行執行 pool execute(t ); pool execute(t ); pool execute(t ); pool execute(t ); pool execute(t ); //關閉線程池 pool shutdown(); } } class MyThread extends Thread{ @Override public void run() { System out println(Thread currentThread() getName()+ 正在執行 ); } } pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 Process finished with exit code 二 單任務線程池 在上例的基礎上改一行創建pool對象的代碼為 //創建一個使用單個 worker 線程的 Executor 以無界隊列方式來運行該線程 ExecutorService pool = Executors newSingleThreadExecutor(); 輸出結果為 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 Process finished with exit code 對於以上兩種連接池 大小都是固定的 當要加入的池的線程(或者任務)超過池最大尺寸時候 則入此線程池需要排隊等待 一旦池中有線程完畢 則排隊等待的某個線程會入池執行

三 可變尺寸的線程池 與上面的類似 只是改動下pool的創建方式 //創建一個可根據需要創建新線程的線程池 但是在以前構造的線程可用時將重用它們 ExecutorService pool = Executors newCachedThreadPool(); pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 Process finished with exit code 四 延遲連接池 import ncurrent Executors; import ncurrent ScheledExecutorService; import ncurrent TimeUnit; /** * Java線程 線程池 * * @author Administrator : : */ public class Test { public static void main(String[] args) { //創建一個線程池 它可安排在給定延遲後運行命令或者定期地執行 ScheledExecutorService pool = Executors newScheledThreadPool( ); //創建實現了Runnable介面對象 Thread對象當然也實現了Runnable介面 Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); //將線程放入池中進行執行 pool execute(t ); pool execute(t ); pool execute(t ); //使用延遲執行風格的方法 pool schele(t TimeUnit MILLISECONDS); pool schele(t TimeUnit MILLISECONDS); //關閉線程池 pool shutdown(); } } class MyThread extends Thread { @Override public void run() { System out println(Thread currentThread() getName() + 正在執行 ); } } pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 Process finished with exit code

五 單任務延遲連接池 在四代碼基礎上 做改動 //創建一個單線程執行程序 它可安排在給定延遲後運行命令或者定期地執行 ScheledExecutorService pool = Executors (); pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 Process finished with exit code 六 自定義線程池 import ncurrent ArrayBlockingQueue; import ncurrent BlockingQueue; import ncurrent ThreadPoolExecutor; import ncurrent TimeUnit; /** * Java線程 線程池 自定義線程池 * * @author Administrator : : */ public class Test { public static void main(String[] args) { //創建等待隊列 BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>( ); //創建一個單線程執行程序 它可安排在給定延遲後運行命令或者定期地執行 ThreadPoolExecutor pool = new ThreadPoolExecutor( TimeUnit MILLISECONDS bqueue); //創建實現了Runnable介面對象 Thread對象當然也實現了Runnable介面 Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); Thread t = new MyThread(); //將線程放入池中進行執行 pool execute(t ); pool execute(t ); pool execute(t ); pool execute(t ); pool execute(t ); pool execute(t ); pool execute(t ); //關閉線程池 pool shutdown(); } } class MyThread extends Thread { @Override public void run() { System out println(Thread currentThread() getName() + 正在執行 ); try { Thread sleep( L); } catch (InterruptedException e) { e printStackTrace(); } } }

pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 pool thread 正在執行 Process finished with exit code 創建自定義線程池的構造方法很多 本例中參數的含義如下

ThreadPoolExecutor

用給定的初始參數和默認的線程工廠及處理程序創建新的 ThreadPoolExecutor 使用 Executors 工廠方法之一比使用此通用構造方法方便得多 參數 corePoolSize 池中所保存的線程數 包括空閑線程 maximumPoolSize 池中允許的最大線程數 keepAliveTime 當線程數大於核心時 此為終止前多餘的空閑線程等待新任務的最長時間 unit keepAliveTime 參數的時間單位 workQueue 執行前用於保持任務的隊列 此隊列僅保持由 execute 方法提交的 Runnable 任務 拋出 IllegalArgumentException 如果 corePoolSize 或 keepAliveTime 小於零 或者 maximumPoolSize 小於或等於零 或者 corePoolSize 大於 maximumPoolSize NullPointerException 如果 workQueue 為 null 自定義連接池稍微麻煩些 不過通過創建的ThreadPoolExecutor線程池對象 可以獲取到當前線程池的尺寸 正在執行任務的線程數 工作隊列等等 有關Java 線程池的內容到此就沒有了 更多的內容還需要研讀API來獲取 lishixin/Article/program/Java/hx/201311/26769

閱讀全文

與java線程池實現相關的資料

熱點內容
解壓縮軟體免安裝版 瀏覽:958
安卓簡訊如何存檔 瀏覽:139
汽車導航不讀文件夾 瀏覽:107
全球雲伺服器如何注冊 瀏覽:884
udp直播流如何在伺服器里播放器 瀏覽:591
macbrew安裝php 瀏覽:425
點特徵提取演算法 瀏覽:502
python彈窗顯示輸入的文字 瀏覽:751
python數字和中文互轉 瀏覽:639
汽車空調壓縮機外殼 瀏覽:458
大型伺服器都是採用什麼模式 瀏覽:5
伺服器為什麼跳閘 瀏覽:398
怎麼用python分析基金收益 瀏覽:990
couple演算法 瀏覽:791
android調用文件管理器 瀏覽:152
中國我的世界最大的小游戲伺服器地址 瀏覽:833
程序員爆破粒子 瀏覽:889
我的世界pcl啟動器怎麼加入伺服器 瀏覽:253
傳奇源碼擴充人物結構 瀏覽:844
購買多個文件夾 瀏覽:774