今天,我們來學學worker模式,大家也好對jdk5.0的執行緒池有乙個更好的理解。
先來看看**:
public class main
}
再來看看傳送請求的client**:
public class clientthread extends thread
public void run() catch (interruptedexception e)
}}
clientthread建立請求,並把請求傳給了channel,下面來看看channel類(相當於執行緒池類)
public class channel
}public void startworkers()
}public synchronized void putrequest(request request) catch (interruptedexception e)
}requestqueue[tail] = request;
tail = (tail + 1) % requestqueue.length;
count++;
notifyall();
}public synchronized request takerequest() catch (interruptedexception e)
}request request = requestqueue[head];
head = (head + 1) % requestqueue.length;
count--;
notifyall();
return request;
}}
channel類把傳給他的請求放入佇列中,等待worker去取請求,下面看看worker(即工作執行緒,執行緒池中已經初始話好的執行緒)
public class workerthread extends thread
public void run()
}}
在工作執行緒中會從執行緒池的佇列裡取出請求,並對請求進行處理。這裡的workerthread相當於背景執行緒,他一直都在執行,當有請求的時候,他就會進行處理,這裡處理請求的執行緒是已經存在在channel(執行緒池裡的執行緒),他不會因為請求的增加而增加(這是本例中的情況),不會來乙個請求就新建立乙個執行緒,節省了資源。
再看看請求的**:
public class request
public void execute() catch (interruptedexception e)
}public string tostring()
}
參考(多執行緒四)中所寫的 executorservice,其就相當於channel,即執行緒池。至於其實現當然要比channel複雜多了,channel只是舉個例子。而workerthread可不是工作執行緒,他相當於傳送到channel的請求,也就是request,當執行**:tpes.execute(workers[i]);時,相當於向執行緒池加入乙個請求,而
workerthread中的run則相當於request中的execute,這也是當執行tpes.execute(workers[i]);時,並不會產生新的執行緒的原因。(多執行緒四)中的寫法是讓人有些迷糊的。executorservice中產生的背景執行緒(相當於本篇的workerthread )我們是看不到的。
jdk5中的多執行緒還有很多需要進一步學習,其實現也反應了多執行緒的設計模式。本篇的worker模式只是其中的一種。
jdk執行緒池學習筆記
1.執行緒池的執行緒儲存在hashset中,處理流程 core pool blocking queue max pool reject policy 2.核心執行緒池一般不會 除非設定了allowcorethreadtimeout,執行緒空閒時處於駐留狀態 locksupport.park 3.ke...
linux多執行緒學習筆記五 執行緒安全
一,執行緒安全基礎 乙個函式被稱為執行緒安全的當且僅當被多個併發執行緒反覆呼叫時,它會一直產生正確的結果。我們能夠定義出四類執行緒不安全函式。第一類 不保護共享變數的函式 共享變數在多執行緒中是共享資料,可以通過同步機制來保護共享資料。第二類 保護跨越多個呼叫狀態的函式 乙個偽隨機數生成器是乙個簡單...
Java多執行緒學習筆記(五)執行緒池
一 執行緒池的基本類 executors 執行緒池工廠,通過 executors 可以取得乙個擁有特定功能的執行緒池。threadpoolexecutor 執行緒池,實現了executor 介面,因此通過這個介面,任何 runnable物件都可以被 threadpoolexecutor執行緒池排程。...