《Java并发》:第三节 创建有返回值的线程

来源:互联网 发布:淘宝修改折扣价权重 编辑:程序博客网 时间:2024/05/25 21:33

1、使用Executor

Java SE5的java.util.concurrent保重的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor允许你管理异步任务的执行,而无需显示管理线程的生命周期。Executor在Java SE5/6/7中是启动任务的优选方法。

class LifeTest implements Runnable {@Overridepublic void run() {while(true){System.out.println(Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}}public class MultiThreadTest {public static void main(String[] args) throws InterruptedException {ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new LifeTest());exec.shutdown();}}
对shutdown方法的调用可以防止新任务被提交给这个Executor。调用shutdown()之后,在shutdown()被调用之前提交的所有任务将继续执行。

2、创建有返回值的线程

Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望任务在完成时可以返回一个值,那么可以实现Callable接口。

class ReturnTest implements Callable<String>{@Overridepublic String call() throws Exception {return "the_returned_value";}}public class ReturnValueThreadTest {public static void main(String[] args) throws InterruptedException, ExecutionException{ExecutorService exec = Executors.newCachedThreadPool();Future<String> retValue = exec.submit(new ReturnTest());System.out.println(retValue.get());}}
对Future<T>.get()的调用将会阻塞,直到结果准备就绪。你还可以调用get(long timeout, TimeUnit unit)来设定超时时间。
0 0