Java多線程之~~~Callable介面獲得傳回值,多線程callable
ThreadPoolExecutor提供了另一個非常強有力的介面,那就是callable。這個介面和runnable類似,但是實現這個
介面的方法是call方法,這個方法是可以返回值的,彌補了runnable不能返回值的悲哀。而且這個方法可以配合ThreadP
oolExecutor使用,獲得Future介面,從這個介面的名字我們就能知道,返回的這個類似於指向這個線程的一個指標,我
們能通過這個Future介面知道當前線程的運行情況,包括是否已經完成任務,目前運行情況,運行完成後的返回值等,
而且每個任務建立後直接通過ThreadPoolExecutor的submit方法提供,有一種非常自動化的感覺。愛不釋手,簡直停不
下來。下面我們就以計算多個數位階層為例子示範一下這個介面的使用方法。
package com.bird.concursey.charpet6;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class FactorialCalculator implements Callable<Integer> {private int number;public FactorialCalculator(int number) {super();this.number = number;}@Overridepublic Integer call() throws Exception {int result = 1;if(number == 0 || number == 1) {result = 1;}else{for(int i = 2; i <= number; i++) {result *= i;TimeUnit.MILLISECONDS.sleep(20);}}System.out.printf("%s: %d\n",Thread.currentThread().getName(),result);return result;}public static void main(String[] args) {ThreadPoolExecutor execute = (ThreadPoolExecutor) Executors.newFixedThreadPool(3);List<Future<Integer>> results = new ArrayList<Future<Integer>>();Random random = new Random();for(int i = 0; i < 10; i++) {int number = random.nextInt(20);FactorialCalculator calcu = new FactorialCalculator(number);Future<Integer> result = execute.submit(calcu);results.add(result);}do{System.out.printf("Main: Number of Completed Tasks:%d\n",execute.getCompletedTaskCount());for (int i=0; i<results.size(); i++) {Future<Integer> result=results.get(i);System.out.printf("Main: Task %d: %s\n",i,result.isDone());}try {TimeUnit.MILLISECONDS.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}while(execute.getCompletedTaskCount() < results.size());System.out.printf("Main: Results\n");for(Future<Integer> fus : results) {try {System.out.printf("Main: Task %d: %d\n",1,fus.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}execute.shutdown();}}
記住使用完成後,一定記得shutdown,這個方法,如果不調用這個方法,execute就會一直等待運行,即使沒有線程
正在運行了,shundown並不是立刻關閉所有的線程,他只是表名,當他控制的其他線程完成後,execute會自動關閉
而已。
JAVA對於callable介面的多線程問題
我想原因是只有一個FutureTask執行個體造成的,一個FutureTask執行個體只能啟動一個線程
再追加一個
FutureTask<Integer> f1 = new FutureTask<Integer>(m);
new Thread(f1, "有傳回值的線程2").start();
JAVA多線程問題,想讓每次線程運行後都可以傳回值給成員變數,要怎更改
把a定義成公用的,在thread裡i++時,a也跟著++就行,,不過你的代碼怎麼構造出了好幾個線程???如果這幾個線程公用一個i變數,那麼Thread1需要實現Runnable介面,而不是繼承Thread類public class XianChengNew {public static int a = 0;public static void main(String[] args) {Thread1 t1 = null;t1 = new Thread1(a);t1.start();boolean flag = true;while (flag){if ( !t1.isAlive()){flag = false;}}System.out.println("Main a = " + a);}}class Thread1 extends Thread {private int i = 0;public Thread1(int i) {super();this.i = i;}@Overridepublic void run() {// super.run();// for(int s = 0; s < 100; s++) {add();// }}synchronized void add() {for (int c = 0; c < 5; c++) {i++;XianChengNew.a++;System.out.println("i= " + i);System.out.println("a= " + XianChengNew.a);}}}