当前位置:首页软件开发Java → Callable和Future

Callable和Future

时间:2019-03-30 13:31:19来源:互联网我要评论(0)

  

 Callable和Future

Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 

Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,

public class Test extends Object{

 

/**

* @param args

*/

public static void main(String[] args) {

ExecutorService threadPool = Executors.newCachedThreadPool();

        final CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);

        for(int i = 1; i < 5; i++) {

            final int taskID = i;

            cs.submit(new Callable<Integer>() {

                public Integer call() throws Exception {

                Thread.sleep(1000);

                    return taskID;

                }

            });

        }

        System.out.println(" ***");

        new Thread(){

        public void run(){

       // 可能做一些事情

       for(int i = 1; i < 5; i++) {

           try {

               System.out.println(cs.take().get());

           } catch (InterruptedException e) {

               e.printStackTrace();

           } catch (ExecutionException e) {

               e.printStackTrace();

           }

       }

        }

        }.start();

        System.out.print(" pong");

}

void c(){

ExecutorService threadPool = Executors.newSingleThreadExecutor();

        Future<Integer> future = threadPool.submit(new Callable<Integer>() {

            public Integer call() throws Exception {

            Thread.sleep(1000);

                return new Random().nextInt(100);

            }

        });

        

         future = threadPool.submit(new Callable<Integer>() {

            public Integer call() throws Exception {

            Thread.sleep(1000);

            int i=new Random().nextInt(100);

            System.out.println(i);

                return i;

            }

        });

        

         future = threadPool.submit(new Callable<Integer>() {

            public Integer call() throws Exception {

            Thread.sleep(1000);

                return new Random().nextInt(100);

            }

        });

        

        System.out.print(" pong");

}

void b(){

for(int i=0;i<5;i++){

Callable<String> c = new Callable<String>(){

public String call() throws Exception {

Thread.currentThread().sleep(2000);

System.out.println("call");

return String.valueOf(new Random().nextInt(100));

}

};

FutureTask<String> future = new FutureTask<String>(c);

       new Thread(future).start();

       

       try {

Thread.currentThread().sleep(1000);

String s;

s = future.get();

System.out.println(s);

}

       catch (InterruptedException e) {

System.out.println("**1**");

e.printStackTrace();

}catch (ExecutionException e) {

e.printStackTrace();

}

}

System.out.print(" pong");

}

void a(){

//int i=0,j,k=0;

//for(j=0;i<6 && j<10;i++,j++){

//k=i+j;

//}

//System.out.println("i="+i + ",j="+j);

 

Callable<String> c = new Callable<String>(){

public String call() throws Exception {

Thread.currentThread().sleep(2000);

System.out.println("call");

return String.valueOf(new Random().nextInt(100));

}

};

FutureTask<String> future = new FutureTask<String>(c);

       new Thread(future).start();

       

       try {

Thread.currentThread().sleep(1000);

String s;

s = future.get();

System.out.println(s);

}

       catch (InterruptedException e) {

System.out.println("**1**");

e.printStackTrace();

}catch (ExecutionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

/*new Thread(){

public void run() {

 

System.out.print("ping");

}

}.start();

try {

Thread.currentThread().sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.print(" pong");

*/

System.out.print(" pong");

}

 

}

相关文章

网友评论

热门评论

最新评论

发表评论 查看所有评论()

昵称:
表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
字数: 0/500 (您的评论需要经过审核才能显示)

关于万荚 | 联系方式 | 发展历程 | 版权声明 | 帮助(?) | 网站地图 | 友情链接

Copyright 2005-2019 16WJ.COM 〖万荚网〗 版权所有 桂ICP备18000060号 |

声明: 本站所有文章来自互联网 如有异议 请与本站联系