工作中常用的建立線程的三種方式:
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。