以下是调用DoCallStuff的主程序。
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Executor {
public static void main(String[] args){
//*1
DoCallStuff call1 = new DoCallStuff(0);
DoCallStuff call2 = new DoCallStuff(1);
DoCallStuff call3 = new DoCallStuff(2);
//*2
ExecutorService es = Executors.newFixedThreadPool(3);//这个是启动线程的类
//*3
Future<E> future1 = es.submit(call1); ---类似与start()方法就是运行线程
Future future2 = es.submit(call2); 因为Callable类似与Runnable,可用泛型
Future future3 = es.submit(call3);
try {
//*4
System.out.println(future1.get());//就是取得所返回的值,可以是默认返回的是Object,我们可以设置为自己需要的
//*5
Thread.sleep(3000);
System.out.println("Thread 2 terminated? :" + future2.cancel(true));
//*6
System.out.println(future3.get());
} catch (ExecutionException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
*1: 定义了几个任务
*2: 初始了任务执行工具。任务的执行框架将会在后面解释。
*3: 执行任务,任务启动时返回了一个Future对象,如果想得到任务执行的结果或者是异常可对这个Future对象进行操作。Future所含的值必须跟Callable所含的值对映,比如说例子中Future对印Callable
*4: 任务1正常执行完毕,future1.get()会返回线程的值
*5: 任务2在进行一个死循环,调用future2.cancel(true)来中止此线程。传入的参数标明是否可打断线程,true表明可以打断。
*6: 任务3抛出异常,调用future3.get()时会引起异常的抛出。
运行Executor会有以下运行结果:
looping....
Task done. //*1
looping....
looping....//*2
looping....
looping....
looping....
looping....
Thread 2 terminated? :true //*3
//*4
java.util.concurrent.ExecutionException: java.lang.Exception: Callable terminated with Exception!
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:205)
at java.util.concurrent.FutureTask.get(FutureTask.java:80)
at concurrent.Executor.main(Executor.java:43)
…….
*1: 任务1正常结束
*2: 任务2是个死循环,这是它的打印结果
*3: 指示任务2被取消
*4: 在执行future3.get()时得到任务3抛出的异常
分享到:
相关推荐
### Java分布式应用学习笔记04:JDK的并发包的集合总结 在深入探讨Java并发包之前,我们先简要回顾一下并发与多线程的基本概念。并发是指多个任务同时进行,而多线程则是实现并发的一种方式。Java平台提供了丰富的...
4. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口以及并发包中的工具类。Java 7在并发编程方面也有所增强,例如Fork/Join框架用于并行计算。 5. **字符串处理**:Java 7在字符串处理上增加...
### Java分布式应用学习笔记06浅谈并发加锁机制分析 #### 1. 前言 在深入探讨Java中的并发加锁机制之前,我们有必要回顾一下多线程环境下的一些基本概念和技术。之前的多线程调度、并发调度以及线程加锁安全等内容...
5. **内存模型和并发**:Java内存模型(JMM)定义了线程之间的可见性和同步,而并发包(java.util.concurrent)提供了高级并发工具。源码解析可以揭示如何实现高效、安全的并发编程。 6. **异常处理和反射**:源码...
### Java分布式应用学习笔记之JDK并发包的集合总结 #### 一、引言 在Java编程中,标准集合框架提供了丰富的容器类型如`HashMap`、`ArrayList`等,但这些容器在多线程环境中使用时,存在着线程安全问题。例如,除了...
第五章涉及多线程和Java并发包(JUC)。多线程使程序能同时执行多个任务,可以通过继承Thread、实现Runnable或使用ExecutorService来创建。Thread类提供了线程控制方法,如设置优先级、命名和线程礼让。线程的生命...
Java并发编程相关的内容,并发包源码分析等 集合框架 Java集合框架,并发容器,同步容器等 IO框架 Java基础字节流 字符流 NIO等 Java8 Java8语言的行为参数化和流编程等 Java虚拟机 Java虚拟机相关,内存模型,类...