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())队列添加完毕后此方法会立即结束。

个人测试,希望大神指点!



原文地址:https://www.cnblogs.com/doudouyu/p/9448124.html

时间: 2024-08-03 15:54:01

java线程池的自带监控,线程池返回值的控制的相关文章

java执行linux shell命令,并拿到返回值

1 package com.suning.spc.util; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.nio.charset.Charset; 6 7 import org.slf4j.Logger; 8 import org.slf4j.LoggerFactory; 9 10 import ch.ethz.ssh2.ChannelCondition; 11 import ch.eth

java中Arrays类中,binarySearch()方法的返回值问题

最近在复习Java知识,发现果然不经常使用忘得非常快... 看到binarySearch()方法的使用时,发现书上有点错误,于是就自己上机实验了一下,最后总结一下该方法的返回值. 总结:binarySearch()方法的返回值为:1.如果找到关键字,则返回值为关键字在数组中的位置索引,且索引从0开始2.如果没有找到关键字,返回值为负的插入点值,所谓插入点值就是第一个比关键字大的元素在数组中的位置索引,而且这个位置索引从1开始. 注意:调用binarySearch()方法前要先调用sort方法对数

WinpCap 使用线程发数,明明发了,返回值0是OK的啊,怎么抓包看不到,难道不支持多线程。。。

if (!m_adapterHandle){    return false;}int rst = pcap_sendpacket((pcap_t*)m_adapterHandle,data ,dataLen);if(rst != 0){    return true;}return false; 看我标黑的就知道了吧,datalen如果为0,发不出去. 而且data如果内容全为'\0',那么也会被屏蔽掉. 这一点官方文档并没有确切的描述,请注意(当然,正常情况下你的报文应该有protocol

Java后端发出post请求带参数并接收返回的json

核心代码: 参数格式: "key1=value1&key2=value2" /*** sendUrl    (远程请求的URL)* param    (远程请求参数)* JSONObject    (远程请求返回的JSON)*/private JSONObject sendPostUrl(String url, String param){ PrintWriter out = null; BufferedReader in = null; JSONObject jsonObje

带参方法与返回值的几个例子

1.带一个参数的方法 1 package cn.happy3; 2 3 public class MyMain { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 //1.购买一台榨汁机 10 ZhaZhiJi machine=new ZhaZhiJi(); 11 12 //2.购买水果 13 String xxx="苹果"; 14 15 //3.bind过程 榨汁 16 String

Android平台调用Web Service:线程返回值

接上文 前文中的遗留问题 对于Java多线程的理解,我以前仅仅局限于实现Runnable接口或者继承Thread类,然后重写run()方法,最后start()调用就算完事,但是一旦涉及死锁以及对共享资源的访问和随时监控线程的状态和执行顺序和线程返回值等就不行了. Callable 和 Future 简介 Callable接口代表一段可以调用并返回结果的代码;Future接口表示是执行异步任务时的状态.返回值等信息.所以说Callable用于产生结果,Future用于获取结果. 1. Callab

Apache Commons-pool实现对象池(包括带key对象池)

Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/commons-pool/ 本文是commons-pool的一个简单应用,包括不带key的池和带key的池.带key的池是把key相同的池对象放在一起池里,也就是说有多少个key就有多少个池. 不带key的池是生产完全一致的对象放在池里,但是有时候,单用对池内所有对象一视同仁的对象池,并不能解决的问题.例如,对

并发实现-Callable/Future 实现返回值控制的线程

package chartone; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * 并发实现-Callable/Future 实现返回值控制的线程 * * @author suntao * @history 2020-0

慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用

来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 calSum( ) 方法中,返回值类型为 int 类型,因此在方法体中必须使用 return 返回一个整数值. 调用带返回值的方法时需要注意,由于方法执行后会返回一个结果,因此在调用带返回值方法时一般都会接收其返回值并进行处理.如: