ITeedu.com
快捷导航
编程语言
WEB开发
手机开发
数据库
操作系统
嵌入式
开源软件
作品
编辑语言
汇编
C/C++
JAVA
Python
Ruby
WEB开发
javascript
J2EE
PHP
Django
关于
ITEEDU
首页
编程语言
汇编
C&C++
JAVA
Python
JAVA笔记主页
JAVA线程安全首页
JAVA同步基础
JAVA同步之线程状态
JAVA同步之守护线程和JOIN方法
JAVA同步之wait()和notify()的使用
JAVA同步之synchronized关键字的使用
JAVA同步设计败笔synchronized
JAVA同步之线程缓存与volatile关键字
JAVA同步之Atomic类的使用
JAVA同步之ThreadLocal的使用
JAVA同步之ThreadLocal使用示例
JAVA同步锁
JAVA同步之ReentrantLock 类简介
JAVA同步之ReentrantLock多条件的使用
JAVA同步之ReentrantLock可中断锁的使用
JAVA同步之ReentrantReadWriteLock
线程安全容器
JAVA同步之线程安全队列Queue
JAVA同步之ArrayBlockingQueue
JAVA同步之LinkedBlockingQueue
LinkedBlockingQueue生产消费模型简单实现
JAVA同步之ConcurrentLinkedQueue
线程池
JAVA同步之线程池简介
JAVA线程池submit和Future的使用
其它
JAVA实现生产者/消费者问题的多种方式
JAVA线程池submit和Future的使用
在Java5之后,任务分两类:一类是实现了`Runnable`接口的类,一类是实现了`Callable`接口的类。两者都可以被`ExecutorService`执行,但是`Runnable`任务没有返回值,而`Callable`任务有返回值。并且`Callable`的`call()`方法只能通过`ExecutorService`的`submit(Callable
task)` 方法来执行,并且返回一个`Future`,是表示任务等待完成的 `Future`。 public interface Callable
返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 `call` 的方法。 `Callable` 接口类似于 `Runnable`,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 `Runnable` 不会返回结果,并且无法抛出经过检查的异常。 `Callable`中的`call()`方法类似`Runnable`的`run()`方法,就是前者有返回值,后者没有。 当将一个`Callable`的对象传递给`ExecutorService`的`submit`方法,则该`call`方法自动在一个线程上执行,并且会返回执行结果`Future`对象。 同样,将`Runnable`的对象传递给`ExecutorService`的`submit`方法,则该`run`方法自动在一个线程上执行,并且会返回执行结果`Future`对象,但是在该`Future`对象上调用get方法,将返回null。 注意:`Future`的`get`方法是阻塞方法,它会一直等到线程返回结果才会继续执行。 下面给个例子: ``` import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; /** * Callable接口测试 */ public class CallableDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); List
> resultList = new ArrayList
>(); //创建10个任务并执行 for (int i = 0; i < 10; i++) { //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 Future< String> future = executorService .submit(new TaskWithResult(i)); //将任务执行结果存储到List中 resultList.add(future); } //遍历任务的结果 for (Future
fs : resultList) { try { System.out.println(fs.get()); //打印各个线程(任务)执行的结果 } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。 executorService.shutdown(); } } } } class TaskWithResult implements Callable
{ private int id; public TaskWithResult(int id) { this.id = id; } /** * 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。 * * @return * @throws Exception */ public String call() throws Exception { System.out.println("call()方法被自动调用,干活!!! " + Thread.currentThread().getName()); //一个模拟耗时的操作 Thread.sleep(1000); return "call()方法被自动调用,任务的结果是:" + id + " " + Thread.currentThread().getName(); } } ```