JAVA多线程—Callable和Future的使用介绍

来源:互联网 发布:genbank数据库介绍 编辑:程序博客网 时间:2024/05/17 09:00

Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。
Callable要采用ExecutorSevicesubmit方法提交,返回的future对象可以取消任务。

java.util.concurrent.Callable<V>类的介绍
这里写图片描述
大概的意思就是说:Callable接口和Runnable接口相似,两者的实例都可以用于运行另一个线程。但是Callable可以返回结果而Runnable不能返回结果。
Callable接口的实现类定义了一个无参的回调方法call();

示例代码:

package syn;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class FutureTest {    public static void main(String[] args) throws Exception {        ExecutorService service = Executors.newSingleThreadExecutor();        Future<String> future = service.submit(new MyCallable());        Thread.sleep(2000);// 加上下面这句则暂停失败,还能看到上面打印的calling。原因:加上这句后,线程已经运行运行起来,如果cancel()方法的参数为false的话,就失败了        // false:可以打断正在运行的线程,true:不能打断正在运行的线程,要等线程运行完成        // 如果加上下面这句,不管值为false还是true,都没有返回结果        future.cancel(false);        System.out.println(future.isCancelled());        if (!future.isCancelled()) {            System.out.println(future.get());        }        System.out.println("end!");        service.shutdown();    }    static class MyCallable implements Callable<String> {        public String call() throws Exception {            for (int i = 0; i < 10; i++) {                Thread.sleep(1000);                System.out.println("calling " + i);            }            return "hello";        }    }}

future.cancel(true);参数为true的运行结果:

这里写图片描述

future.cancel(false);参数为false的运行结果:

这里写图片描述

无future.cancel(false);这行的运行结果:

这里写图片描述

0 0
原创粉丝点击