JAVA线程池中的Callable和Future

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Callable Future  completionService test
 *
 * Future取得结果类型和Callable返回的结果
 *
 * Callable需要ExecutorService使用submit方式提交
 *
 * CompletionService 用于提交一组Callable,其中take方法返回已经完成的Callable任务
 *
 * @author duwenlei
 *
 */
public class CallableFutureTest {

    private static void testCallable() throws Exception {
        ExecutorService service = Executors.newSingleThreadExecutor();
        Future<String> future = service.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(5000);    //停止5秒返回
                return "hello";
            }
        });
        System.out.println("等待结果");
        System.out.println("取得结果:"+future.get());
        //System.out.println("取得结果:"+future.get(1, TimeUnit.SECONDS));
        service.shutdown();
    }

    private static void testCompletionService() throws Exception{
        ExecutorService executor = Executors.newFixedThreadPool(3);
        CompletionService<Integer> service = new ExecutorCompletionService<Integer>(executor);    //需要一个线程池
        for (int i = 1; i <= 10; i++) {
            final int seq = i;
            service.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(new Random().nextInt(5000));    //休息时间,不确定
                    return seq;
                }
            });
        }
        for (int i = 1; i <= 10; i++) {
            System.out.println(service.take().get());
        }
        executor.shutdown();
    }

    public static void main(String[] args) {
        try {
            testCallable();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            testCompletionService();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
时间: 2024-08-29 23:43:25

JAVA线程池中的Callable和Future的相关文章

Java多线程系列--“JUC线程池”06之 Callable和Future

概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544116.html Callable 和 Future 简介 Callable 和 Future 是比较有趣的一对组合.当我们需要获取线程的执行结果时,就需要用到它们.Callable用于产生结果,Future用于获取结果. 1. Callable Calla

JAVA线程池中队列与池大小的关系

JAVA线程中对于线程池(ThreadPoolExecutor)中队列,池大小,核心线程的关系写出自己的理解: 1:核心线程:简单来讲就是线程池中能否允许同时并发运行的线程的数量 2:线程池大小:线程池中最多能够容纳的线程的数量. 3:队列:对提交过来的任务的处理模式. 对于线程池与队列的交互有个原则: 如果队列发过来的任务,发现线程池中正在运行的线程的数量小于核心线程,则立即创建新的线程,无需进入队列等待.如果正在运行的线程等于或者大于核心线程,则必须参考提交的任务能否加入队列中去. 1:提交

Java线程池中线程的状态简介

首先明确一下线程在JVM中的各个状态(JavaCore文件中) 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition(重点关注) 4.等待监控器检查资源,Waiting on monitor(eg:如果使用System.out.println等需要分配计算机资源的时候线程会如此等待,主要还需看堆栈) 5.暂停,Suspended 6.对象等待中,Object.wait() 7.阻塞,Blocked(重点关注) 8

java线程池中以代码的顺序运行,主要是记录一下继承线程池的内容

1.这个是自定义的线程池类,直接上代码 package org.jimmy.threadtest20181121; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutor201811281311 extends ThreadPoolE

Java线程池中线程的生命周期

设:我们有一个coreSize=10,maxSize=20,keepAliveTime=60s,queue=40 1.池初始化时里面没有任何线程. 2.当有一个任务提交到池就创建第一个线程. 3.若继续提交任务,有空闲线程就调拨空闲线程来处理任务?若没有线程空闲则再新建一个线程来处理,如此直到coreSize.[预热阶段] 4.若继续提交任务,有空闲线程就调拨空闲线程来处理任务,如果没有空闲线程(10个)则将任务缓存到queue中排队等待. 5.若继续提交任务,而已有线程不空闲,且queue也满

Java线程池中submit()和execute之间的区别?

一: submit()方法,可以提供Future < T > 类型的返回值. executor()方法,无返回值. execute无返回值 public void execute(Runnable command) { if (command == null) throw new NullPointerException();//抛掉异常 int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(com

Java线程池停止空闲线程是否有规则呢?

Java线程池中线程的数量超过核心线程的数量,且所有线程空闲,空闲时间超过keepAliveTime,会停止超过核心线程数量的线程,那么会保留哪些线程呢?是不是有规则呢? 测试代码: ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5)); int taskNum = 13; for (int i = 0; i <

Java:多线程,线程池,使用CompletionService通过Future来处理Callable的返回结果

1. 背景 在Java5的多线程中,可以使用Callable接口来实现具有返回值的线程.使用线程池的submit方法提交Callable任务,利用submit方法返回的Future存根,调用此存根的get方法来获取整个线程池中所有任务的运行结果. 方法一:如果是自己写代码,应该是自己维护一个Collection保存submit方法返回的Future存根,然后在主线程中遍历这个Collection并调用Future存根的get()方法取到线程的返回值. 方法二:使用CompletionServic

多线程篇七:通过Callable和Future获取线程池中单个务完成后的结果

使用场景:如果需要拿到线程的结果,或者在线程完成后做其他操作,可以使用Callable 和 Futrue 1.定义一个线程池,向线程池中提交单个callable任务 ExecutorService threadPools=Executors.newSingleThreadExecutor(); Future<String> future=threadPools.submit(new Callable<String>() { @Override public String call(