Java線程的創建和啟動
Java線程的線程創建有三種方法
1.繼承Thread類創建線程
2.實現Runnable接口創建線程
3.使用Callable和Future創建線程
其中第一種和第二種是老生常談了,這里就不多說了,我主要介紹第三種方法
從Java5開始Java提供Callable接口,該接口怎么看都像是Runnable接口的增強版,Callable接口提供一個call方法可以作為線程的執行體,但call()方法比run()方法功能更強大。
call()方法可以有返回值。
call()方法可以聲明拋出異常。
Java5提供了Future接口來代表Callable接口里call()方法的返回值,并為Future接口提供一個FutureTask實現類,該實現類實現了Future接口,可以作為Thread類的target。
Future接口里提供了如下幾個方法控制它關聯的Callable任務
boolean cancel(boolean mayInterruptIfRunning):試圖取消該Future里關聯的Callable任務。
V get():返回call()方法的返回值,該方法將導致程序阻塞,必須等到子線程結束后才會得到返回值。
V get(long timeout,TimeUnit unit):返回call()方法的返回值,最多等待指定時間,如果在指定時間Callable仍然沒有返回值,將會拋出TimeoutException。
boolean isCancelled():如果在Callable任務正常完成前被取消,則返回true。
boolean isDone():如果Callable任務已完成,則返回true。
- import java.util.concurrent.Callable;
- import java.util.concurrent.FutureTask;
- public class Test implements Callable<String>{
- public static void main(String[] args) throws Exception
- {
- Test t=new Test();
- FutureTask ft=new FutureTask(t);
- Thread th=new Thread(ft,"子線程");
- th.start();
- System.out.println("結果是"+ft.get());
- }
- @Override
- public String call() throws Exception {
- // TODO Auto-generated method stub
- int i;
- for(i=0;i<10000;i++)
- {
- System.out.println(i);
- }
- return String.valueOf(i);
- }
- }