課程
/后端開發
/Java
/深入淺出Java多線程
軍隊作戰到什么時候才會進行下一步Thread.sleep(50)呢
2017-09-19
源自:深入淺出Java多線程 2-5
正在回答
同問?
了解了線程,可以去了解下 隊列, 對于處理高并發,和提高業務數據吞吐量會很有用。
package?com.junbao.thread; import?java.util.ArrayList; import?java.util.List; import?java.util.NoSuchElementException; import?java.util.concurrent.ArrayBlockingQueue; import?java.util.concurrent.BlockingQueue; import?java.util.concurrent.ExecutorService; import?java.util.concurrent.Executors; public?class?ThreadTest?{ static??ExecutorService??executorService??=??Executors?.?newFixedThreadPool?(5)?; @SuppressWarnings("deprecation") public?static?void?main(String[]?args)?throws?InterruptedException?{ ThreadTest?test?=?new?ThreadTest(); List<Integer>?numList?=?new?ArrayList<Integer>(); for?(int?i?=?0;?i?<?10;?i++)?{ numList.add(i); } //?隊列 ?final?BlockingQueue<Integer>?queue?=?new?ArrayBlockingQueue<Integer>(numList.size()); //?放入 try?{ for?(Integer?ints?:?numList)?{ queue.put(ints); } }?catch?(Exception?e)?{ //?TODO:?handle?exception } final?List<Integer>?outList?=?new?ArrayList<Integer>(); for?(int?j?=?0;?j?<?5;?j++)?{ new?Thread()?{ public?void?run()?{ while?(true)?{ try?{ //?將此處的睡眠時間分別改為100和1000,觀察運行結果 Thread.sleep((int)?(Math.random()?*?(1000?-?100)?+?100)); String?name1?=?Thread.currentThread().getName(); System.out.println(name1?+?"準備取數據!"); Integer?num?=?queue.take();//?如果沒有了數據,就會阻塞 String?name2?=?Thread.currentThread().getName(); outList.add(num); System.out.println(name2?+?"已經取走數據,"?+?"隊列目前有"?+?queue.size()?+?"個數據"); }?catch?(InterruptedException?e)?{ e.printStackTrace(); }?catch?(NoSuchElementException?e1)?{ //?TODO:?handle?exception } } } }.start(); } try?{ while?(true)?{ if?(queue.isEmpty())?{ System.out.println("空了,可以執行其他的任務了:打印輸出轉以后的列表"); test.showList(outList); System.out.println(Thread.currentThread().getState()); break; } } }?catch?(Exception?e)?{ //?TODO:?handle?exception } test(); } public?void?showList(List<Integer>?list)?{ System.out.println(list.toString()); } public?static?void?test(){ System.out.println("繼續往下執行,看看還有什么可以做"); } }
誰說一定要結束才會執行sleep,不是說你能很準確知道作戰到什么時候會進行下一步,兩個線程運行是狀態是交互的,然后你還有個stage線程,三個線程都是獨立的。你這兩個運行會,他還是會運行stage線程里的sleep方法的。
我覺得應該是上面兩個線程都結束了,才繼續進行下面的sleep,你可以將50設置的大一點,比如好幾毫秒,然后你可以看一下運行結果。
16k閃存大腦3954634 提問者
慕瓜3258604
慕瓜3258604 回復 慕瓜3258604
舉報
帶你一起深入淺出多線程,掌握基礎,展望進階路線
2 回答sleep問題
2 回答sleep()使用問題
4 回答sleep()
3 回答關于sleep();
3 回答關于Sleep對interrupt的影響
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2018-04-17
同問?
2017-10-29
了解了線程,可以去了解下 隊列, 對于處理高并發,和提高業務數據吞吐量會很有用。
2017-10-29
2017-09-22
誰說一定要結束才會執行sleep,不是說你能很準確知道作戰到什么時候會進行下一步,兩個線程運行是狀態是交互的,然后你還有個stage線程,三個線程都是獨立的。你這兩個運行會,他還是會運行stage線程里的sleep方法的。
2017-09-19
我覺得應該是上面兩個線程都結束了,才繼續進行下面的sleep,你可以將50設置的大一點,比如好幾毫秒,然后你可以看一下運行結果。