併發程式設計6 執行器

2021-09-23 21:25:19 字數 2419 閱讀 3222

如果想開發伺服器應用,應該有大的吞吐量和快速的響應。  這樣就要求伺服器段有清晰的任務邊界和任務執行策略。

現在看乙個伺服器應用:

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 如果分而治之的執行緒很多,就會形成執行緒的佇列,這裡面就會有完成的快和慢的不同執行緒。快的執行緒執行完成以後...