程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 多線程——實現Callable接口

多線程——實現Callable接口

編輯:C++入門知識

前兩篇博客(多線程——繼承Thread類,多線程——實現Runnable接口 )介紹了java使用線程的兩種方法,這篇博客繼續介紹第三種方法——實現Callable接口。

先說一下Runnable和Callable的區別:

1、Callable規定的方法是call(),Runnable規定的方法是run().

2、Callable的任務執行後可返回值,而Runnable的任務是不能返回值得

3、call方法可以拋出異常,run方法不可以

4、運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,還可獲取執行結果。

還沿用前兩篇博客的例子,只不過這裡稍作改動。現在我們不僅要輸入單詞的長度,而且還要求計算出字符串數組中所有單詞的長度之和。

很明顯,這樣一改動,多線程的執行體就需要有一個返回值,用以計算所有單詞的長度之和。而runnable中的run方法是不能有返回值的,所以,這裡我們只能使用callable。具體代碼如下:

package test;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class Test1{
	public static void main(String [] args ) {
		String [] words = {"first","second","world","thread"};
		
		//創建一個線程池
		ExecutorService pool = Executors.newCachedThreadPool(  );
        Set> set = new HashSet>();
        
        for (String word: words) {
            Callable callable = new testCallable(word);
            Future future = pool.submit(callable);
            set.add(future);
        }
        int sum = 0;
        for (Future future : set) {
            try {
				sum += future.get();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
        }
        System.out.println("數組中所有單詞的總長度為:" + sum);
	}

	
}


class testCallable implements Callable{
	private String word;
	
	public testCallable(String word){
		
		this.word = word;
	}
	
	@Override
	public Integer call() throws Exception {
		System.out.println(Thread.currentThread().getName() + ": 開始執行!" );
		try {
			//假設處理需要2秒
			Thread.currentThread().sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + ": 正在處理!" );
		System.out.println(Thread.currentThread().getName() + ": " + word + "長度為:" + word.length());
		return Integer.valueOf(word.length()); 
	}
}

執行結果如下:

pool-1-thread-1: 開始執行!
pool-1-thread-3: 開始執行!
pool-1-thread-4: 開始執行!
pool-1-thread-2: 開始執行!
pool-1-thread-1: 正在處理!
pool-1-thread-1: first長度為:5
pool-1-thread-3: 正在處理!
pool-1-thread-3: world長度為:5
pool-1-thread-2: 正在處理!
pool-1-thread-2: second長度為:6
pool-1-thread-4: 正在處理!
pool-1-thread-4: thread長度為:6
數組中所有單詞的總長度為:22

至此,java中創建線程的三種方法都以介紹完畢。當然,了解了這些只能說明對於多線程你剛剛入門,更多關於多線程的知識還有待於我們繼續發掘,深入研究。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved