package thread.pool;
import java.util.concurrent.Callable;
/**
* Callable 和 Future接口
* Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
* Callable和Runnable有几点不同:
* (1)Callable规定的方法是call(),而Runnable规定的方法是run().
* (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
* (3)call()方法可抛出异常,而run()方法是不能抛出异常的。
* (4)运行Callable任务可拿到一个Future对象,Future 表示异步计算的结果。
* 它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
* 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
*/
public class SayCallable implements Callable {
private String taskname;
private int taskflag = 0;
public SayCallable(String name, int flag) {
taskname = name;
taskflag = flag;
}
public String call() throws Exception {
if (taskflag == 0) {
return taskname + ", flag = " + taskflag;
}
if (taskflag == 1 || taskflag == 2) {
try {
while (true) {
System.out.println("hi");
Thread.sleep(200);
}
} catch (InterruptedException e) {
System.out.println(taskname + ", exception = " + e.toString());
// 由于阻塞函数(wait, sleep, join 等函数)除了抛出异常外,
// 还会清除线程中断状态,因此在这里要保留线程的中断状态。
Thread.currentThread().interrupt();
}
return taskname + ", flag = " + taskflag;
} else {
return taskname + ", flag = " + taskflag;
}
}
}
package thread.pool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class Test {
/**
* @author jzh add 2011-12-21
* @param args
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
// 定义3个Callable类型的任务
SayCallable task1 = new SayCallable("task1", 0);
SayCallable task2 = new SayCallable("task2", 1);
SayCallable task3 = new SayCallable("task3", 1);
// 创建一个线程池(指定线程数量为3)
// Executors 类提供了用于此包中所提供的执行程序服务的工厂方法
ExecutorService pool = Executors.newFixedThreadPool(3);
// 第一个任务
try {
// 采用submit提交并执行任务,然后返回了一个Future对象。
Future future1 = pool.submit(task1);
// 调用get方法,一直等待任务执行完毕返回结果,然后再往下执行。
System.out.println("task1: " + future1.get());
} catch (Exception e) {
System.out.println("task1: exception = " + e.getMessage());
}
// 第二个任务
try {
Future future2 = pool.submit(task2);
// 休眠1秒。
Thread.sleep(1000);
// 取消任务的执行
System.out.println("task2: cancel = " + future2.cancel(true));
}
catch (Exception e) {
System.out.println("task2: cancel = " + e.getMessage());
}
// 第三个任务
try {
Future future3 = pool.submit(task3);
// 等待1秒,超时后会抛出TimeoutException
System.out.println("task3: " + future3.get(1, TimeUnit.SECONDS));
} catch (Exception e) {
System.out.println("task3: " + e.toString());
}
// 尝试停止所有正在执行的活动任务,暂停处理正在等待的任务。
pool.shutdownNow();
}
}