如果想開發伺服器應用,應該有大的吞吐量和快速的響應。 這樣就要求伺服器段有清晰的任務邊界和任務執行策略。
現在看乙個伺服器應用:
public static void main(string args) throws ioexception
}
順序執行的,造成資源利用率低, 吞吐量或響應速度都很低。
來乙個多執行緒的:
public static void main(string args) throws ioexception
}.start();
}}
會有吞吐量,響應速度上的好處。
但是因為程式併發,可能要注意資源衝突。
另外其還會造成執行緒無線增長帶來的棧溢位,記憶體溢位, 建立執行緒的開銷過大等問題。
更好的辦法是,能夠平緩的進行優化,就是能夠更好的排程任務,控制線程的個數等等。這就需要用到executor框架
先來個固定執行緒數的:
public static void main(string args) throws ioexception
};exec.execute(task);
}}
exccutors.可以建立多個策略的執行器。 newfixedthreadpool是可以執行指定書目的執行器。
這個是乙個生產者和消費者模式, exec.execute是生產, fixedthreadpool表示有空閒的執行緒就能消費這個task.
executor是用乙個策略來執行任務,那麼策略應該決定執行緒的那些行為呢:
我們需要使用和調整各種策略,來達到最優的效果
這些策略基本上都是基於執行緒池的。
執行緒池與任務佇列緊密相連。
當執行緒池中有空閒執行緒時會從佇列中拿乙個任務進行執行。
executorservice。 這個介面包含了很多生命週期的方法:
shutdown() 停止接收新任務, 等待已提交任務的完成, 再次想加入新任務會丟擲rejectedexecutionexception
shutdownnom 停止為執行的任務,並且嘗試關閉正在執行的任務
awaittermination等待到達終止狀態,跟輪詢判斷istrminated的效果一樣。通常shutdown會緊隨其後,進入種植狀態後就關閉executor
isshutdown 判斷是否關閉
istermination 判斷是否進入終止狀態:
例如可關閉的server:
public class webserver
system.exit(0);
}}.start();
while (true)
};exec.execute(task);}}
private static void handlerequest(socket s)
system.out.println(line);
} catch (ioexception e) finally catch (ioexception e) }}
}
timer 和timertask
使用簡單,但是是點執行緒排程,並且任務如果丟擲異常,會影響其他任務
schedulethreadpoolexecutor 1.5之後更好的排程執行器
public class testcallable
for (futurefuture : futurelist) catch (interruptedexception e) catch (executionexception e) }}
}class addcallable implements callable
@override
public integer call() throws exception
}
executorservice submit callable進去。 返回future, get()會阻塞到執行結果或者丟擲異常, 如果丟擲executionexception則可以使用getcause得到異常鏈。
如果第乙個任務比第二個任務執行的時間長,則可能造成不能及時獲取到返回結果。可以使用get(0)不停地試探,但是可以使用更好的方式使用自帶阻塞佇列的executorcompletionservice中
public static void main(string args) throws interruptedexception, executionexception
});serv.submit(new callable()
});for (int i = 0; i < 2; i++)
executor.shutdown();
}
併發程式設計6
io模型 模型就是套路,是解決某個固定問題的方式方法 io模型是解決io問題的方式 io指的是輸入輸出,輸入輸裝置的速度對比cpu而言是非常慢的,比如recv,input等都屬於io操作 io操作最大的問題就是會阻塞程式的執行 io模型要解決的也僅僅是網路io操作 io模型有以下幾個 1 阻塞io ...
併發程式設計 任務執行
1 每當看到下面這種 new thread runnable start 時,請考慮用executor 2 executor 1 建立方式 executors.new.2 通過使用executor,可以實現各種調優 管理 監視 記錄日誌 錯誤報告 3 executor有4個生命週期 建立 提交 開始...
併發程式設計(6) forkjoin
forkjion裡面的兩個重要的概念 分而治之,什麼是分而治之?乙個大的事情平均分成幾個相同小的事情,如果沒有達到最小的要求,就繼續分,一直分到達到的要求。工作密取,workstealing 如果分而治之的執行緒很多,就會形成執行緒的佇列,這裡面就會有完成的快和慢的不同執行緒。快的執行緒執行完成以後...