java線程池的內建監控,線程池傳回值的控制

來源:互聯網
上載者:User

標籤:str   except   oid   shu   ack   print   his   vat   []   

 

當使用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線程池的內建監控,線程池傳回值的控制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.