1. 程式人生 > >java線程池的自帶監控,線程池返回值的控制

java線程池的自帶監控,線程池返回值的控制

java線程 his data ++ 添加 tde mce call ble

當使用java線程池的時候,返回值類型用future<T> 來接收,比如:

Future<String> future = fixedThreadPool.submit(new Thread());
返回的結果必須由線程執行完畢後才會返回,我們可以利用這一點進行線程堵塞,監控線程的結束時間。
package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestDemo9 { ExecutorService indes = Executors.newCachedThreadPool(); public static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); public static void main(String[] args) { try { new TestDemo9().test(); } catch
(Exception e) { System.out.println("有錯誤"); } System.out.println("此進程執行結束"); } public void test() throws Exception{ List<Future<String>> list = new ArrayList<>(); for(int i = 0; i < 10 ; i ++) { Future
<String> future = indes.submit(new TestDemo9().new Test9(i)); list.add(future); } System.out.println("加入隊列結束"); /*for(Future<String> fu : list) { System.out.println(fu.get()); if(fu.get().equals("future集合7")) { System.out.println("7此時的線程已經執行結束了"); break; } }*/ //System.out.println(fixedThreadPool.isTerminated()); //list.clear(); //System.out.println("size"+list.size()); //fixedThreadPool.shutdown(); System.out.println("集合打印結束"); //System.out.println(fixedThreadPool.isShutdown()); } class Test9 implements Callable<String>{ private int count; public Test9(int count) { this.count = count; } @Override public String call() throws Exception { if(count == 1) { System.out.println("第一進程開始運行"); } //Thread.sleep(5000); //List<Future<String>> fut = new ArrayList<>(); Future<String> f = TestDemo10.fixedThreadPool.submit(new Test10(count)); String s = "future集合"; System.out.println("執行"+count); s = s+count; if(count == 1) { System.out.println(f.get()); System.out.println("1!!!!!執行結束"); } return s; } } class Test10 implements Callable<String>{ private int count; public Test10(int count) { this.count = count; } @Override public String call() throws Exception { if(count == 1) { System.out.println("開始執行1111111"); } Thread.sleep(5000); String s = "future集合"; System.out.println(count); s = s+count; if(count == 1) { System.out.println("1開始睡覺 5秒鐘"); Thread.sleep(5000); System.out.println("1 睡覺完畢,"); } System.out.println(count+"執行結束"); return s; } } }

如測試代碼所示,線程沒有執行完畢,會通過System.out.println(f.get());進行堵塞,此方法不會結束,利用這一點可以監控線程的執行時間。

如果去掉System.out.println(f.get())隊列添加完畢後此方法會立即結束。

個人測試,希望大神指點!



java線程池的自帶監控,線程池返回值的控制