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)相同點

都是接口,都可編寫多線程程序,都是調(diào)用Thread.start()啟動線程


2)不同點

Callable可以返回執(zhí)行結(jié)果,是個泛型,與Future、FutureTask配合可以通過FutureTask.get()獲取異步執(zhí)行的結(jié)果,但是Runnable不可以。

Callable里面有取消這個任務(wù),而且異??梢酝鈷?,但是Runnable異常只能內(nèi)部run消化。

FutureTask.get()得到異步執(zhí)行的結(jié)果,此方法會阻塞主進(jìn)程的繼續(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) {
            
            //構(gòu)建Callable
            Callable<String> callable = new Callable<String>() {
                @Override
                public String call() throws Exception {
                    Thread.sleep(2000);
                    return "chenyu callable finish";
                }
            };
            
            //構(gòu)建FutureTask
            FutureTask<String> futureTask = new FutureTask<>(callable);
            
            //運(yùn)行線程
            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 運(yùn)行結(jié)果

如果注釋掉// futureTask.cancel(true)運(yùn)行結(jié)果如下

    chenyu begin
    false
    chenyu callable finish
    true
    chenyu end

如果不注釋掉futureTask.cancel(true)運(yùn)行結(jié)果如下

    chenyu begin
    false
    the thread is cancel

 


 作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)