java的多執行緒學習,第四記
阿新 • • 發佈:2018-12-21
假如寫網路程式設計的程式,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 = newRunnable() { @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是所有執行緒都死掉了。