国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java判斷線程池線程是否執行完畢

瀏覽:2日期:2022-09-01 10:18:32

在使用多線程的時候有時候我們會使用 java.util.concurrent.Executors的線程池,當多個線程異步執行的時候,我們往往不好判斷是否線程池中所有的子線程都已經執行完畢,但有時候這種判斷卻很有用,例如我有個方法的功能是往一個文件異步地寫入內容,我需要在所有的子線程寫入完畢后在文件末尾寫“---END---”及關閉文件流等,這個時候我就需要某個標志位可以告訴我是否線程池中所有的子線程都已經執行完畢,我使用這種方式來判斷。

public class MySemaphore { public static void main(String[] args) throws IOException, InterruptedException { final File stream = new File('c:tempstonefengstream.txt'); final OutputStream os = new FileOutputStream(stream); final OutputStreamWriter writer = new OutputStreamWriter(os); final Semaphore semaphore = new Semaphore(10); ExecutorService exec = Executors.newCachedThreadPool(); final long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { final int num = i; Runnable task = new Runnable() {@Overridepublic void run() { try { semaphore.acquire(); writer.write(String.valueOf(num)+'n'); semaphore.release(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }} }; exec.submit(task); } exec.shutdown(); while(true){ if(exec.isTerminated()){writer.write('---END---n');writer.close();System.out.println('所有的子線程都結束了!');break; } Thread.sleep(1000); } final long end = System.currentTimeMillis(); System.out.println((end-start)/1000); }}

當調用ExecutorService.shutdown方法的時候,線程池不再接收任何新任務,但此時線程池并不會立刻退出,直到添加到線程池中的任務都已經處理完成,才會退出。在調用shutdown方法后我們可以在一個死循環里面用isTerminated方法判斷是否線程池中的所有線程已經執行完畢,如果子線程都結束了,我們就可以做關閉流等后續操作了。

判斷線程池中的線程是否全部執行完畢的另外一種解決方案則是使用閉鎖(CountDownLatch)來實現,CountDownLatch是一種靈活的閉鎖實現,它可以使一個或多個線程等待一組事件發生。閉鎖狀態包括一個計數器,該計數器被初始化為一個正數,表示需要等待的事件數量。countDown方法遞減計數器,表示有一個事件已經發生了,而await方法等待計數器達到零,即表示需要等待的事情都已經發生??梢允褂瞄]鎖來這樣設計程序達到目的:

public class CountDownLatchApproach { public static void main(String[] args) throws IOException, InterruptedException { final int nThreads = 10; final CountDownLatch endGate = new CountDownLatch(nThreads); final File stream = new File('c:tempstonefengstream.txt'); final OutputStream os = new FileOutputStream(stream); final OutputStreamWriter writer = new OutputStreamWriter(os); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < nThreads; i++) { final int num = i; Runnable task = new Runnable() {@Overridepublic void run() { try { writer.write(String.valueOf(num)+'n'); } catch (IOException e) { e.printStackTrace(); } finally { endGate.countDown(); }} }; exec.submit(task); } endGate.await(); writer.write('---END---n'); writer.close(); }}

這種解決方案雖然可以達到目的但是性能差到沒朋友,我更傾向于使用第一種方案。

現在我們有了更優雅的第三種方案,它的執行性能也不錯。

public class MySemaphore { public static void main(String[] args) throws IOException, InterruptedException { final File stream = new File('c:tempstonefengstream.txt'); final OutputStream os = new FileOutputStream(stream); final OutputStreamWriter writer = new OutputStreamWriter(os); final Semaphore semaphore = new Semaphore(10); ExecutorService exec = Executors.newCachedThreadPool(); final long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { final int num = i; Runnable task = new Runnable() {@Overridepublic void run() { try { semaphore.acquire(); writer.write(String.valueOf(num)+'n'); semaphore.release(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); }} }; exec.submit(task); } exec.shutdown(); exec.awaitTermination(1, TimeUnit.HOURS); writer.write('---END---n'); writer.close(); System.out.println('ËùÓеÄ×ÓÏ̶߳¼½áÊøÁË£¡'); final long end = System.currentTimeMillis(); System.out.println((end-start)/1000); }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 成年女人永久免费观看片 | 国产成人99久久亚洲综合精品 | 免费精品99久久国产综合精品 | 久草免费在线视频观看 | 亲子乱子伦xxxx | 兔子先生节目在线观看免费 | 国内精品一区二区在线观看 | 国产成人在线播放 | 手机看片自拍自自拍日韩免费 | 精品国产成人 | 九九色网| 全部孕妇毛片丰满孕妇孕交 | 国产网站在线 | a在线观看欧美在线观看 | 国产精品特黄一级国产大片 | 中国美女一级看片 | 国产在线观看精品香蕉v区 国产在线观看免费人成小说 | 欧美日本在线视频 | 成人久久免费视频 | 亚洲成aⅴ人片在线影院八 亚洲成av人片在线观看 | 成人性动漫高清免费观看网址 | 欧美一区二区三区久久久人妖 | 黄色a三级免费看 | 美女黄视频免费观看 | 国产网站黄 | 亚洲精品在线影院 | 免费欧美一级片 | 日韩中文字幕在线亚洲一区 | 午夜男人女人爽爽爽视频 | 成人综合影院 | 欧美视频免费一区二区三区 | 69精品免费视频 | 中日韩美中文字幕 | 欧美69xx | 亚洲欧美v视色一区二区 | 5x性区m免费毛片视频看看 | 高清性色生活片久久久 | 国产成人精品男人的天堂538 | 国产三级三级三级 | xxxwww在线播放| 中文字幕视频网站 |