精华内容
下载资源
问答
  • 程序中使用的是Callable接口,可以获取线程返回值。 package liuzh; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent....

     

    程序中使用的是Callable接口,可以获取线程的返回值。

     

    package liuzh;
    
    import java.util.LinkedList;
    import java.util.List;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    import java.util.concurrent.LinkedBlockingDeque;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    
    class Task implements Callable<String> {
        private String filename;
    
        public Task(String filename) {
            this.filename = filename;
        }
        
        @Override
        public String call() throws Exception {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("完成 "+ filename);
            return "返回值" + filename;
        }
    }
    
    /**
     * 创建一个线程池,将50个任务分配进去,并发量最大为5
     * 运行结束后,输出每个线程返回的结束
     * title:ThreadPoolExecutorTest
     * descript:
     * @author liuzh
     * @date 2016年5月18日 下午8:16:26
     */
    public class ThreadPoolExecutorTest {
        
        public void start() throws InterruptedException, ExecutionException {
            /**
             * 创建线程池,并发量最大为5
             * LinkedBlockingDeque,表示执行任务或者放入队列
             */
            ThreadPoolExecutor tpe = new ThreadPoolExecutor(5, 10, 0,
                    TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(),
                    new ThreadPoolExecutor.CallerRunsPolicy());
    
            //存储线程的返回值
            List<Future<String>> results = new LinkedList<Future<String>>();
            
            for (int i = 0; i < 10; i++) {
                Task task = new Task(String.valueOf(i));
                System.out.println("放入线程池:" + i);
                //调用submit可以获得线程的返回值
                Future<String> result = tpe.submit(task);
                results.add(result);
                
            }
    
            //此函数表示不再接收新任务,
            //如果不调用,awaitTermination将一直阻塞
            tpe.shutdown();
            //1天,模拟永远等待
            System.out.println(tpe.awaitTermination(1, TimeUnit.DAYS));
    
            //输出结果
            for (int i = 0; i < 10; i++) {
                System.out.println(results.get(i).get());
            }
    
        }
    
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            ThreadPoolExecutorTest test = new ThreadPoolExecutorTest();
            test.start();
        }
    
    }

    输出样例:

    放入线程池:0
    放入线程池:1
    放入线程池:2
    放入线程池:3
    放入线程池:4
    放入线程池:5
    放入线程池:6
    放入线程池:7
    放入线程池:8
    放入线程池:9
    完成 1
    完成 0
    完成 2
    完成 3
    完成 4
    完成 9
    完成 6
    完成 8
    完成 5
    完成 7
    true
    返回值0
    返回值1
    返回值2
    返回值3
    返回值4
    返回值5
    返回值6
    返回值7
    返回值8
    返回值9

     

    参考:http://www.cnblogs.com/vhua/p/5277694.html

            http://www.cnblogs.com/hzmark/archive/2013/01/21/JavaExecutor.html

    转载于:https://www.cnblogs.com/liu-zh/p/5506492.html

    展开全文
  • 先上网上的使用代码 _chk_th_pool = ThreadPoolExecutor(max_workers=4) # 创建...我能搜索到的线程池获取返回值的方式都是这个,然而使用map和as_completed方式时future就是你的return原始数据,不需要使用result

    先上网上的使用代码

     _chk_th_pool = ThreadPoolExecutor(max_workers=4)  # 创建校验线程池
            for future in _chk_th_pool.map(self.ipdata_format,all_datas):
                data = future.result()

    我能搜索到的线程池获取返回值的方式都是这个,然而使用map方式时future就是你的return原始数据,不需要使用result()函数去获取

    _chk_th_pool = ThreadPoolExecutor(max_workers=4)  # 创建校验线程池
            for future in _chk_th_pool.map(self.ipdata_format,all_datas):
            logginginfo(future)
     
    展开全文
  • Java线程-线程池-带返回值

    千次阅读 2019-03-12 09:54:19
    Java5之前,线程是没有返回值的。Java5之后,可以写有返回值的任务了。 有返回值的任务必须实现Callable接口,没有返回值的任务实现Runnable接口。 执行Callable接口后,可以获得一个Future的一个对象,通过Feture的...

    Java5之前,线程是没有返回值的。Java5之后,可以写有返回值的任务了。
    有返回值的任务必须实现Callable接口,没有返回值的任务实现Runnable接口。
    执行Callable接口后,可以获得一个Future的一个对象,通过Feture的get方法就能获得返回的Object数据了。
    代码如下:

    public class ThreadExtend_Pool_Return_Value {
    
        public static void main(String args[]) throws ExecutionException, InterruptedException {
            //创建一个线程池
            ExecutorService executorService= Executors.newFixedThreadPool(2);
            //创建有两个返回值的线程
            Callable callable1=new CallableImpl("callable1");
            Callable callable2=new CallableImpl("callable2");
            //执行任务并获取future对象
            Future future1=executorService.submit(callable1);
            Future future2=executorService.submit(callable2);
            //从future获取返回值,并输出到控制台
            System.out.println(">>>>"+future1.get().toString());
            System.out.println(">>>>"+future2.get().toString());
            //关闭线程池
            executorService.shutdown();
        }
    }
    /**
     * 有返回值的线程需要实现Callable接口
     */
    class CallableImpl implements Callable{
        private String oid;
        CallableImpl(String oid){
            this.oid=oid;
        }
        @Override
        public Object call(){
            return this.oid+"任务返回的内容";
        }
    }
    

    运行后,结果如下:

    >>>>callable1任务返回的内容
    >>>>callable2任务返回的内容
    
    展开全文
  • "线程返回值:" +f.get()); //通过Future的get()方法获取返回值 } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } pool....
    package com.utils;
    
    import javax.xml.crypto.Data;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.concurrent.*;
    
    /**
     * Author:   linjunit
     * Version:
     * Date:     2017/11/13 0013
     * Description:
     * Modification  History:
     * Date            Author            Version            Description
     * --------------------------------------------------------------
     * Why & What is modified:
     */
    public class CallableFutureTest {
        public  static void   Test(){
            ExecutorService pool =  Executors.newFixedThreadPool(3);//创建指定数量的线程池
            List<Future> listFuture=new ArrayList<Future>();//多个线程的返回值集合
            for(int i=0;i<3;i++)
            {
                Callable ca = new MyCallable(i);//创建callable实例化对象
                Future ft = pool.submit(ca);//执行线程并将返回值放入Future中
                listFuture.add(ft);
            }
            for(Future f:listFuture){
                try {
                    System.out.print("线程返回值:"+f.get());//通过Future的get()方法获取返回值
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
            pool.shutdown();//关闭线程池
        }
    
    }
    class MyCallable implements Callable<Object>{
        private  Integer threadName;
    
        /**
         * 定义一个构造函数 获取当前线程名称
         * @param threadName
         */
        MyCallable(Integer threadName){
            this.threadName=threadName;
        }
    
        /**
         * 重写 call()方法,实现主体,并有返回值
         * @return
         * @throws Exception
         */
        @Override
        public Object call() throws Exception {
            Date d1=new Date();
            Thread.sleep(1000);
            Date d2=new Date();
            return(threadName+"执行完毕"+"执行时间为"+(d2.getTime()-d1.getTime()));
        }
    }
    展开全文
  • jdk1.5之后多了Callable接口 默认方法call 类似Runnable的run方法 执行具体任务 但不同的是run方法返回值是void 但是call方法是有返回值的 并一般使用Future接受 通过get方法获取 另外除了返回值 如果执行失败也会有...
  • (1)主线程等待法 ...//获取线程返回值1:主线程等待 public class CycleWait implements Runnable{ private String value; @Override public void run() { try { Thread.sleep(5000); } catc...
  • ExecutorService实现获取线程返回值

    千次阅读 2018-01-15 17:15:25
    什么是ExecutorService? ExecutorService是java.util.concurrent包中的一个线程池实现接口。...普通线程池通过配置线程池大小,能有效管理线程的调度,在执行大量异步线程时提高程序的性能。延迟任务线程池可控
  • 1.用线程池执行多个线程。 2.每一个线程都有返回值。 3.然后将每个线程的返回结果汇总。 思路: 1.返回值,于是想到用callable,future,其他两种线程执行方式都是没有返回值的。 2.判定所有线程执行完成? ...
  • //结论:会,如果调用get()方法,只有子线程执行返回结果主线程才能继续执行,如果不调用get()方法主线程执行则无需等待子线程返回结果 @Test public void test() throws ExecutionException, ...
  • 有时候,我们可能有 需要拿到线程执行完毕的返回值的需求,这时我们可用通过java.util.concurrent.Future类与Callable接口来完成,如下所示: //必须实现Callable接口 class MyCallable implements Callable{ ...
  • ThreadPool 出现于2.0时代 ...线程池:预先准备好线程,少了会补充,多了会销毁多余部分 价值:速度快 基本代码 包含最基本的使用 //多线程 Console.WriteLine("开始"); WaitCallback act = t => { Thre
  • 如何获取线程返回值

    千次阅读 2020-06-22 17:50:12
    获取线程的返回值 ...通过Callable接口实现call()获取线程返回值(通过FutrueTask Or 线程池获取,推荐使用) FutrueTask的构造方法可以传入Callable实现类的实例; isDone()可以判断call是否执行结束;
  • Python多种方法获取线程返回值

    千次阅读 2019-07-02 21:23:39
    近段时间,工作上需要用到多线程,并且要获取线程返回值,python多线程一般使用threading模块,但threading模块有个问题,无法返回线程里面运行的结果,我通过三种方法讲解如何获取线程返回值。 一、通过...
  • 线程池的主要思想是为了减少每次获取资源的消耗,提高对资源的利用率; 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能...
  • 修改后:
  • 线程池需要返回值 线程池的创建 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 500, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20), Executors.defaultThreadFactory(), new ...
  • java获取线程返回值

    千次阅读 2019-10-30 08:44:43
    对于多线程大家都不陌生,可以提高咱们程序的执行效率,但是各线程之间都是独立运行,如何来获取各个线程的数据并集中处理呢?废话少说,下面上代码。 1.首先多线程要实现Callable接口,记住是Callable,一定要加上...
  • 那么怎么获取线程返回的值呢,我这里总结了三种方式: 主线程等待 Join方法等待 实现Callable接口 Entity 类 package com.basic.thread; /** * @author zhangxingrui * @create 2019-02-...
  • 主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下
  • 使用线程池创建线程

    2021-07-16 21:03:00
    思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完 放回池中。可以避免频繁创建销毁、实现重复利用。 好处: 1 提高响应速度(减少了创建新线程的时间) 2 降低资源消耗(重复利用线程池线程,不...
  • 获取返回值 futurefutureTask 或线程池ExecutorService .submit(Callable<t>实现类); 上一篇:java 线程锁 可重入锁 可中断锁 公平锁 非公平锁ReentrantLock synchronized,条件Condition,读写锁 Reentran.....
  • java获取线程返回值

    2019-09-30 13:36:41
    可以通过三种方法获取线程返回值: 主线程等待法,主线程一直等待到子线程完毕返回为止:比如说子线程需要5秒才能进行赋值,主线程开启子线程后,直接输出那个值得到的是null,那么我们要让主线程一直等(sleep...
  • 如何获取线程返回值概述获取值的多种方式传递入参、出参利用线程池获取返回值Future和Callable的差异UML图 概述 很多场景下,我们需要线程的返回值来进行下一步操作,那么究竟怎么来获取么? 在这里,提供了集中...
  • Java多线程-线程池ThreadPoolExecutor的submit返回值Future

    万次阅读 多人点赞 2017-05-05 16:09:12
    起原文地址 http://blog.csdn.net/qq_25806863/article/details/71214033一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中:public ...}这个方法是没有返回值的,而且只接受Runnable。那
  • [JAVA]拿到线程返回值具体实现 本人菜鸡一只,前段时间遇到了这个问题,现在做一下总结。 先来看创建线程的两种方式: Runnable 需要重写run方法,需要注意的是run方法没有返回值,那么主动获取就为空。 Callable ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,264
精华内容 20,905
关键字:

线程池获取线程的返回值