線程的四種實現方式

1.繼承Thread,重寫run()方法,而後用thread.start()啓動線程。 2.實現Runnable接口,重寫Run方法。而後用thread.start()方法啓動線程。 注意:Thread類的底層實現也是實現的Runnable接口。因此這二者建立線程的方法,通常選擇Runnable. 3.實現Callable接口。重寫call方法。有關線程的建立。緩存

@Test
	public void test03(){
		//建立一個Callable的實現類
		Callable<Integer> oneCallable = new MyCallableThread<Integer>();
		///註釋:FutureTask<Integer>是一個包裝器,它經過接受Callable<Integer>來建立,它同時實現了Future和Runnable接口
		//由Callable的實現類建立一個FutureTask對象
		FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable);
		//由FutureTask建立一個threa對象
		Thread oneThread = new Thread(oneTask);
		oneThread.start();
	}

4.是有返回值的線程如何就行操做。 實體類併發

public class MyReturnCallableThread implements Callable<Object>{
	
	private String taskNum;
	MyReturnCallableThread(String taskNum){
		this.taskNum = taskNum;
	}
	
	@Override
	public Object call() throws Exception {
		System.out.println(">>>" + taskNum + "任務啓動");  
		   Date dateTmp1 = new Date();  
		   Thread.sleep(1000);  
		   Date dateTmp2 = new Date();  
		   long time = dateTmp2.getTime() - dateTmp1.getTime();  
		   System.out.println(">>>" + taskNum + "任務終止");  
		   return taskNum + "任務返回運行結果,當前任務時間【" + time + "毫秒】";
	}

}

調用方法ide

@Test
	@SuppressWarnings("unchecked")
	public void test04() throws InterruptedException, ExecutionException{
		System.out.println("----程序開始運行----");  
		   Date date1 = new Date();  
		  
		   int taskSize = 5;  
		   // 建立一個線程池 ,數量爲5
		   ExecutorService pool = Executors.newFixedThreadPool(taskSize);  
		   // 建立多個有返回值的任務  
		   List<Future> list = new ArrayList<Future>();  
		   for (int i = 0; i < taskSize; i++) {  
		    Callable c = new MyReturnCallableThread(i + " ");  
		    // 執行任務並獲取Future對象  
		    Future f = pool.submit(c);  
		    System.out.println(">>>" + f.get().toString()); 
		    // System.out.println(">>>" + f.get().toString());  
		    list.add(f);  
		   }  
		   // 關閉線程池  
		   pool.shutdown();  
		  
		   // 獲取全部併發任務的運行結果  
		   for (Future f : list) {  
		    // 從Future對象上獲取任務的返回值,並輸出到控制檯  
		    System.out.println(">>>" + f.get().toString());  
		   }  
		  
		   Date date2 = new Date();  
		   System.out.println("----程序結束運行----,程序運行時間【"  
		     + (date2.getTime() - date1.getTime()) + "毫秒】"); 
	}

上述代碼中Executors類,提供了一系列工廠方法用於建立線程池,返回的線程池都實現了ExecutorService接口。 public static ExecutorService newFixedThreadPool(int nThreads) 建立固定數目線程的線程池。 public static ExecutorService newCachedThreadPool() 建立一個可緩存的線程池,調用execute 將重用之前構造的線程(若是線程可用)。若是現有線程沒有可用的,則建立一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。 public static ExecutorService newSingleThreadExecutor() 建立一個單線程化的Executor。 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 建立一個支持定時及週期性的任務執行的線程池,多數狀況下可用來替代Timer類。this

ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。若是Executor後臺線程池尚未完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成線程

相關文章
相關標籤/搜索