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


 

當使用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())隊列添加完畢后此方法會立即結束。

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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM