Java之Callable和Runnable

1 接口定义

1) Callable接口

    public interface Callable<V> {
        V call() throws Exception;
    }

2) Runnable接口

    public interface Runnable {
        public abstract void run();
    }

 
2 不同点和相同点

1)相同点

都是接口,都可编写多线程程序,都是调用Thread.start()启动线程


2)不同点

Callable可以返回执行结果,是个泛型,与Future、FutureTask配合可以通过FutureTask.get()获取异步执行的结果,但是Runnable不可以。

Callable里面有取消这个任务,而且异常可以外抛,但是Runnable异常只能内部run消化。

FutureTask.get()得到异步执行的结果,此方法会阻塞主进程的继续往下执行。

 
3 Callable测试用例

    import java.util.Random;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
     
    public class TestCallableAndFuture {
        public static void main(String[] args) {
            
            //构建Callable
            Callable<String> callable = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    Thread.sleep(2000);
                    return "chenyu callable finish";
                }
            };
            
            //构建FutureTask
            FutureTask<String> futureTask = new FutureTask<>(callable);
            
            //运行线程
            new Thread(futureTask).start();
            
            try {
                System.out.println("chenyu begin");
                System.out.println(futureTask.isDone());
                //futureTask.cancel(true);
                if (!futureTask.isCancelled()) {
                    System.out.println(futureTask.get());
                    System.out.println(futureTask.isDone());
                    System.out.println("chenyu end");
                } else {
                    System.out.println("the thread is cancel");
                }
                    
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    
 
4 运行结果

如果注释掉// futureTask.cancel(true)运行结果如下

    chenyu begin
    false
    chenyu callable finish
    true
    chenyu end

如果不注释掉futureTask.cancel(true)运行结果如下

    chenyu begin
    false
    the thread is cancel

 


 作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)