天天看點

java并發程式設計:線程的三種建立方式

工作中常用的建立線程的三種方式:

1、繼承Thread類

2、實作Runnable接口

3、實作Callable

樣例:

(1)繼承Thread類

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("繼承Thread");
    }
}
           

(2)實作runnable接口

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("實作了Runnable");
    }
}
           

為什麼有了上面兩種方式建立線程,為啥還要第三種實作callable接口呢?

我們觀察裡面的run方法,傳回的都是void,也就是說這兩種方式都不能傳回處理後的結果。但是Callable接口的出現可以有效地解決這一問題。

(3)實作callable接口

1、建立一個實作了Callable接口的線程

class MyCallable implements Callable<Integer>{
    System.out.println(Thread.currentThread().getName()+"進入callable");
    @Override
    public Integer call() throws Exception {
        int value = 1;
        return value;
    }
}
           

2、使用線程

public static void main(String[] args) throws Exception{
        FutureTask<Integer> task = new FutureTask<>(new MyCallable());
        Thread thread = new Thread(task,"線程A");
        thread.start();
        System.out.println("Callable傳回的結果是:"+task.get());
    }
           

Future是一個函數式接口,大家可以自行百度。Future還有以下方法:

(1)cancel方法用來取消任務,如果取消任務成功則傳回true,如果取消任務失敗則傳回false。

參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設定true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定傳回false,即如果取消已經完成的任務會傳回false;

如果任務正在執行,若mayInterruptIfRunning設定為true,則傳回true,

若mayInterruptIfRunning設定為false,則傳回false;

如果任務還沒有執行,則無論mayInterruptIfRunning為true還是false,肯定傳回true。

(2)isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則傳回 true。

(3)isDone方法表示任務是否已經完成,若任務完成,則傳回true;

(4)get()方法用來擷取執行結果,這個方法會産生阻塞,會一直等到任務執行完畢才傳回;

(5)get(long timeout, TimeUnit unit)用來擷取執行結果,如果在指定時間内,還沒擷取到結果,就直接傳回null。