亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

sleep的問題

http://img1.sycdn.imooc.com//59c0d5cc0001497504000179.jpg

軍隊作戰到什么時候才會進行下一步Thread.sleep(50)呢

正在回答

5 回答

同問?

0 回復 有任何疑惑可以回復我~

了解了線程,可以去了解下 隊列, 對于處理高并發,和提高業務數據吞吐量會很有用。

0 回復 有任何疑惑可以回復我~
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("繼續往下執行,看看還有什么可以做");
	}
	
}


0 回復 有任何疑惑可以回復我~

誰說一定要結束才會執行sleep,不是說你能很準確知道作戰到什么時候會進行下一步,兩個線程運行是狀態是交互的,然后你還有個stage線程,三個線程都是獨立的。你這兩個運行會,他還是會運行stage線程里的sleep方法的。

0 回復 有任何疑惑可以回復我~

我覺得應該是上面兩個線程都結束了,才繼續進行下面的sleep,你可以將50設置的大一點,比如好幾毫秒,然后你可以看一下運行結果。

0 回復 有任何疑惑可以回復我~
#1

16k閃存大腦3954634 提問者

上面兩個線程是while(true)的死循環呀,怎么執行的完
2017-09-19 回復 有任何疑惑可以回復我~
#2

慕瓜3258604

111
2018-03-02 回復 有任何疑惑可以回復我~
#3

慕瓜3258604 回復 慕瓜3258604

111111
2018-03-02 回復 有任何疑惑可以回復我~
#4

慕瓜3258604 回復 慕瓜3258604

222
2018-03-02 回復 有任何疑惑可以回復我~
查看1條回復

舉報

0/150
提交
取消
深入淺出Java多線程
  • 參與學習       186072    人
  • 解答問題       502    個

帶你一起深入淺出多線程,掌握基礎,展望進階路線

進入課程

sleep的問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號