freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

[計(jì)算機(jī)]實(shí)戰(zhàn)javaconcurrent-展示頁

2024-09-07 16:03本頁面
  

【正文】 s .poolSize = poolSize。 poolSize) { void public * see createExecutorService() /** executorService = (poolSize)。 void public * 關(guān)閉當(dāng)前ExecutorService,隨后根據(jù)poolSize創(chuàng)建新的ExecutorService } } ()。 (InterruptedException e) { (timeout, )。 {amp。 null if timeout) { void public * param timeout 以毫秒為單位的超時(shí)時(shí)間 * /** nodes。 ()。 (InterruptedException e) { ()。 (ExecutionException e) { (())。 { for } } else (timeout ListFutureNode futures = null 。 { ArrayListNode(())。 long public * see invokeAll() * 在線程池中執(zhí)行所有給定的任務(wù)并取回運(yùn)行結(jié)果 } return ListNode invokeAll(ListValidationTask tasks) { */ * 在線程池中執(zhí)行所有給定的任務(wù)并取回運(yùn)行結(jié)果,使用默認(rèn)超時(shí)時(shí)間 } void public * 使用線程池中的線程來執(zhí)行任務(wù) } ThreadPoolService( int */ /** executorService。 private DEFAULT_TASK_TIMEOUT = */ /** 5 。 DEFAULT_POOL_SIZE int final static public * 默認(rèn)線程池大小 classpublic*/* author DigitalSonic 。import 。import 。import 。 service。用Thread的start()方法沒有返回值,如果該線程執(zhí)行的方法有返回值那用 ExecutorService就再好不過了,可以選擇submit()、invokeAll()或者invokeAny(),根據(jù)具體情況選擇合適的方法即可。Executors通過這個(gè)類能夠獲得多種線程池的實(shí)例,例如可以調(diào)用newSingleThreadExecutor()獲得單線程的 ExecutorService,調(diào)用newFixedThreadPool()獲得固定大小線程池的ExecutorService。依賴關(guān)系可以構(gòu)成一張有向圖,可能存在環(huán)。內(nèi)容涵蓋了并發(fā)集合類、線程池機(jī)制、同步互斥機(jī)制、線程安全的變量更新工具類、鎖等等常用工具。從JDK ,它的引入大大簡化了多線程程序的開發(fā)(要感謝一下大牛Doug Lee)。加上現(xiàn)在很多開發(fā)者接觸到的項(xiàng)目都是打著企業(yè)級旗號的B/S項(xiàng)目,大多數(shù)人都很少涉及多線程,這又為本文的主角增加了一份神秘感。點(diǎn)擊:1686次編寫多線程的程序一直都是一件比較麻煩的事情,要考慮很多事情,處理不好還會出很多意想不到的麻煩。實(shí)戰(zhàn)java Concurrent時(shí)間:20090924 08:09:55來源:網(wǎng)絡(luò)作者:未知加上現(xiàn)在很多開發(fā)者接觸到的項(xiàng)目都是打著企業(yè)級旗號的B/S項(xiàng)目,大多數(shù)人都很少涉及多線程,這又為本文的主角增加了一份神編寫多線程的程序一直都是一件比較麻煩的事情,要考慮很多事情,處理不好還會出很多意想不到的麻煩。講到Java多線程,大多數(shù)人腦海中跳出來的是Thread、Runnable、synchronized……這些是最基本的東西,雖然已經(jīng)足夠強(qiáng)大,但想要用好還真不容易。,、 。為了便于理解,本文使用一個(gè)例子來做說明,交代一下它的場景:假設(shè)要對一套10個(gè)節(jié)點(diǎn)組成的環(huán)境進(jìn)行檢查,這個(gè)環(huán)境有兩個(gè)入口點(diǎn),通過節(jié)點(diǎn)間的依賴關(guān)系可以遍歷到整個(gè)環(huán)境。為了提高檢查的效率,考慮使用多線程。拿到 ExecutorService可以做的事情就比較多了,最簡單的是用它來執(zhí)行Runnable對象,也可以執(zhí)行一些實(shí)現(xiàn)了 CallableT的對象。Java代碼packageimport 。import 。import 。import/*** 線程池服務(wù)類* ThreadPoolService { /** */ = * 默認(rèn)一個(gè)任務(wù)的超時(shí)時(shí)間,單位為毫秒 public static final long 1000 。 private int poolSize = DEFAULT_POOL_SIZE。 ExecutorService * 根據(jù)給定大小創(chuàng)建線程池 public poolSize) { setPoolSize(poolSize)。 /** */ execute(Runnable task) { (task)。 /** * * see invokeAll(List, long) public invokeAll(tasks, DEFAULT_TASK_TIMEOUT * ())。 /** * * param timeout 以毫秒為單位的超時(shí)時(shí)間,小于0表示不設(shè)定超時(shí) */ ListNode invokeAll(ListValidationTask tasks, timeout) { ListNode nodes = new try if 0 ) { futures = (tasks)。 { futures = (tasks, timeout, )。 (FutureNode future : futures) { try } catch } } } catch } return } * 關(guān)閉當(dāng)前ExecutorService */ destoryExecutorService( long (executorService != amp。 !()) { try } catch } ()。 /** */ createExecutorService() { destoryExecutorService(1000 )。 } * 調(diào)整線程池大小 */ setPoolSize( int createExecutorService()。}import 。import 。import 。import 。* 線程池服務(wù)類*/public class ThreadPoolService { public static final int = 5。 /** * 默認(rèn)一個(gè)任務(wù)的超時(shí)時(shí)間,單位為毫秒 */ poolSize = DEFAULT_POOL_SIZE。 private ExecutorService public ThreadPoolService(int poolSize) { /** * 使用線程池中的線程來執(zhí)行任務(wù) */ (task)。 } * see invokeAll(List, long) */ return invokeAll(tasks, DEFAULT_TASK_TIMEOUT * ())。 } * param timeout 以毫秒為單位的超時(shí)時(shí)間,小于0表示不設(shè)定超時(shí) * see invokeAll() */ ListNode nodes = new ArrayListNode(())。 try { futures = (tasks)。 } else { for (FutureNode future : futures) { (())。 } catch (ExecutionException e) { } ()。 } * param timeout 以毫秒為單位的超時(shí)時(shí)間 */ if (executorService != null amp。 !()) { (timeout, )。 } catch (InterruptedException e) { ()。 } /** * 關(guān)閉當(dāng)前ExecutorService,隨后根據(jù)poolSize創(chuàng)建新的ExecutorService */ destoryExecutorService(1000)。 executorService = (poolSize)。 } public void setPoolSize(int poolSize) {前者會執(zhí)行給定的所有CallableT對象,等所有任務(wù)完成后返回一個(gè)包含了執(zhí)行結(jié)果的ListFutureT,()都是true,可以用 ()拿到結(jié)果;后者只要完成了列表中的任意一個(gè)任務(wù)就立刻返回,返回值就是執(zhí)行結(jié)果。本代碼是在JDK ,如果在JDK ,很可能在invokeAll和invokeAny的地方出錯(cuò)。造成這個(gè)問題的主要原因是兩個(gè)版本中invokeAll和invokeAny的方法簽名不同, invokeAll(Collection? extends CallableT tasks),(CollectionCallableT tasks)。和其他資源一樣,線程池在使用完畢后也需要釋放,用shutdown()方法可以關(guān)閉線程池,如果當(dāng)時(shí)池里還有沒有被執(zhí)行的任務(wù),它會等待任務(wù)執(zhí)行完畢,在等待期間試圖進(jìn)入線程池的任務(wù)將被拒絕。Lock多線程編程中常常要鎖定某個(gè)對象,之前會用synchronized來實(shí)現(xiàn),現(xiàn)在又多了另一種選擇,那就是 。使用Lock時(shí)需要自己獲得鎖并在使用后手動釋放,這一點(diǎn)與synchronized有所不同,所以通常Lock的使用方式是這樣的:Java代碼Lock l = ...。 { // 執(zhí)行操作} finallyLock l = ...。()。// 執(zhí)行操作} finally {},比較常用的應(yīng)該是ReentrantLock。 service。 。import/*** 節(jié)點(diǎn)類* Node { private private private PASS 。 String[] dependencies = String[] {}。 Lock lock = Reentran
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1