`

JDK1.5并发包学习笔记(2)

阅读更多
以下是调用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抛出的异常
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics