Java主線程等待所有子線程執行完畢再執行解決辦法

方法一:

Thread.join()方法

Vector<Thread> ts = new Vector<Thread>();
		for (int i = 0; i < 200; i++) {
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					Counter.inc();
				}
			});
			ts.add(t);
			t.start();
		}
		for (Thread t : ts) {
			try {
				t.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("----------" + Counter.count);

(全部代碼見上一篇文章)

這個循環中的join的意思是:子線程排好隊,歡迎新同學main線程,main線程對着排好隊的他們說,我站你後邊,我站你後邊,我站你後邊。。。。(ts.size()次)。然後站到最後一個的後面了。恩、


方法二:

用線程池。

代碼:

		ExecutorService threadPool = Executors.newScheduledThreadPool(10);
//		ExecutorService threadPool = Executors.newCachedThreadPool();
		for (int i = 0; i < 200; i++) {
			threadPool.execute(new Runnable() {

				@Override
				public void run() {
					chi.inc();
				}
			});
		}
		threadPool.shutdownNow();
		try {
			threadPool.awaitTermination(3, TimeUnit.MICROSECONDS);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("------" + chi.count);

Executors是個工廠,(工廠模式),創建出幾種不同類別的線程池。這裏我用ScheduledThreadPool。(因爲好使,註釋掉的那種不知爲什麼不管用)。

然後用shutdownNow(),這個方法是馬上停止(試圖)正在執行的任務,線程池進入STOP狀態,不再開啓正在等待的線程。

對比的,shutdown()方法是阻止等待中的進程開啓,等待所有正在執行的進程完成。

【這裏我有疑惑,爲什麼註釋掉的類型不行。以後再研究,希望有人指點迷津】

發佈了27 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章