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可以返回執(zhí)行結果,是個泛型,與Future、FutureTask配合可以通過FutureTask.get()獲取異步執(zhí)行的結果,但是Runnable不可以。

Callable里面有取消這個任務,而且異常可以外拋,但是Runnable異常只能內部run消化。

FutureTask.get()得到異步執(zhí)行的結果,此方法會阻塞主進程的繼續(xù)往下執(zhí)行。

 
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
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎入門進階人工智能(鏈接)