java 并发runable,callable,future,futureTask

转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html

package future_call;

import java.util.concurrent.Callable;

/**
 * Created by luozhitao on 2017/8/10.
 */
public class Task implements Callable<Integer> {
  //  @Override
    public Integer call() throws Exception {

        System.out.println("子线程在进行计算");

        Thread.sleep(10000);
        System.out.println("子线程睡眠完毕");
        int sum=0;
        for (int i=0;i<100;i++){

            sum+=i;

        }

        return sum;
    }
}

1.使用Callable+Future

package future_call;

import java.util.concurrent.*;

/**
 * Created by luozhitao on 2017/8/10.
 */
public class Task_test {

    public static void main(String [] args){

        ExecutorService executorService= Executors.newCachedThreadPool();
        Task task=new Task();
        Future<Integer> future=null;
        try{
           // executorService

            future=executorService.submit(task);
            System.out.println("线程池关闭之前");
            executorService.shutdown();
            System.out.println("线程池关闭之后");

        }catch (RejectedExecutionException e){System.out.println(e);}

        try{

           Thread.sleep(1000);

        }catch (InterruptedException e){e.printStackTrace();}

        System.out.println("主线程在进行计算");

        try{

            System.out.println(future.get());

        }catch (InterruptedException e){e.printStackTrace();} catch (ExecutionException e){e.printStackTrace();}

    }
}

2.使用Callable+FutureTask

package future_call;

import java.util.concurrent.*;

/**
 * Created by luozhitao on 2017/8/10.
 */
public class future_task1 {

    public static void main(String [] args){

        ExecutorService executorService= Executors.newCachedThreadPool();
        Task task=new Task();
        FutureTask<Integer> futureTask=new FutureTask<Integer>(task);
        try {
            /*
            executorService.submit(futureTask);
            executorService.shutdown();
            */
            Thread thread=new Thread(futureTask);
            thread.start();

        }catch (RejectedExecutionException e){e.printStackTrace();}

        try {
            Thread.sleep(1000);
            System.out.println("主线程睡眠完毕");
        }catch (InterruptedException e){e.printStackTrace();}

        try{

            System.out.println(futureTask.get());

        }catch (InterruptedException e){e.printStackTrace();}catch (ExecutionException e){e.printStackTrace();}

    }

}
时间: 2024-08-10 21:30:27

java 并发runable,callable,future,futureTask的相关文章

Java 并发编程——Callable+Future+FutureTask

项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable实现. import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Ex

java并发编程之future模式

1.当你想并发去执行一段代码,但是还想获取这段代码的返回结果,那么future多线程模式就可以派上用场了,代码实现如下. public class Client { public Data request() { final FutureData futureData = new FutureData(); new Thread(new Runnable() { @Override public void run() { futureData.setRealData(new RealData()

并发实现-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并发:Callable、Future和FutureTask

Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callabl

java多线程编程之Future/FutureTask和Callable

有这样一种场景,用多线程发送数据到某个服务器,需要知道各个线程是否都发送成功,等所有线程都发送完成才能继续下一轮计算和发送.如果用传统的多线程方式,就需要启动多个线程,然后在每个线程中分别发送数据,外部通过某种方式等待各个线程全部都发送完成,再进行后面的计算等流程.这种实现方式的代码会比较臃肿,在java中提供了一种Callable+Future的方法,可以将异步的多线程调用变为同步方式. Callable 在java的多线程编程中,有Thread和Runnable两种方式来新建线程,其中Run

【原创】JAVA并发编程——Callable和Future源码初探

JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的. thread和runnable不讨论了. 太多地方可以找到他们的探究了 重点看callable和future, 先上一段代码: package com.future.chenjun.test; import java.util.concurrent.Callab

Callable,Future,FutureTask

1.概念定义 2.实现例子 3.总结 1.概念定义 1.Callable Callable是一个接口,效果类似Runnable接口.实现该接口,然后,耗时操作在call()方法中执行.与Runnable接口不同的是,call方法需要返回执行的结果. public interface Callable<V>{ V call() throws Exception; } public interface Runnable{ void run(); } 2.Future A Future repres

12 Callable &amp; Future &amp; FutureTask

创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callable.Future和FutureTask三个类的使用方法. 1 Callable与Runnable

【java并发】Callable与Future的应用

Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的.但是 Runnable 不会返回结果,并且无法抛出经过检查的异常.而Callable可以返回一个结果,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子: public class CallableAndFuture { public static void main(String[] args) { ExecutorService thr