1. 程式人生 > >java的多執行緒學習,第四記

java的多執行緒學習,第四記

假如寫網路程式設計的程式,socket程式設計就是響應客戶程式設計的服務端。

public class ThreadPool {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(80);
        while (true){
            Socket socket = serverSocket.accept();
            Runnable task = new
Runnable() { @Override public void run() { handleRequest(socket); } }; new Thread(task).start(); } } private static void handleRequest(Socket socket) { } }

這樣做,每來一個就建立一個執行緒,會出現很多問題的。java虛擬機器就掛掉了,記憶體溢位。

資源消耗得不到限制,並不能控制執行緒的數量。

//Executor 執行緒池
建立執行緒池
Executor executor = Executors.newFixedThreadPool(100);

擁有100執行緒的執行緒池。

Executor executor1 = Executors.newSingleThreadExecutor();
 

池子裡,永遠只有一個執行緒。平常如果new一個執行緒,掛掉了就沒有了。

single這個如果被佔用了,就阻塞這裡等著,如果有異常了,就拿一條新的執行緒。

Executor executor2 = Executors.newCachedThreadPool();

這個是緩衝執行緒池,不知道有多少個執行緒。來一個建立一個,來一個建立一個。沒有上限的。

Executor是個介面,ExecutorService是個子類。

執行緒池的任務丟進去是不可控的,什麼時間關閉,如果executor沒有執行完,jvm是不可能關閉的,除非你強行關閉電源。

ExecutorService提供了關閉的方法。

List<Runnable> shutdownNow();
void shutdown();
boolean isTerminated();

執行緒池有三種狀態:

1,執行狀態。running

2,關閉狀態。shutdown狀態,不是立即終止,停止接受新的任務,但是等待提交的任務完成。

3,終止狀態。什麼任務都完成了。把執行緒池掐掉。

shutdownNow返回還沒有執行完的任務的執行緒。isTerminated是所有執行緒都死掉了。