在使用線程時,我們有時需要獲得線程的計算結果,但是,Runnable 和Thread 線程結束後並沒有返回線程信息的功能,使用輪詢的方法很耗CPU。我們發現swing中的界面設計的時候,會使用各種Listener,觸發事件的時候就會回調相應的註冊類對象的函數。我們不妨也可以這樣考慮,採用監聽設計模式,在Thread中註冊一些監聽,然後等線程完成的時候,回調監聽,這樣我們就可以利用這個方式從線程中返回我們需要的信息了。
//定義監聽類
public interface CallBackListener {
public void performance(String result);
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//定義線程類
public class CallbackThread implements Runnable {
String result = null;
List<CreateCallbackThread> listeners = new ArrayList<CreateCallbackThread>();
public CallbackThread(int value) {
result = value + ": ";
}
@Override
public void run() {
result = result + this;
this.callback();
}
public void callback() {
for(Iterator<CreateCallbackThread> it = listeners.iterator(); it.hasNext(); ) {
CreateCallbackThread listener = it.next();
listener.receive(result);
}
}
public void addListener(CreateCallbackThread listener) {
listeners.add(listener);
}
public void removeListener(CreateCallbackThread listener) {
listeners.remove(listener);
}
}
//定義任務類,該類生成線程處理業務
public class CreateCallbackThread {
private String result = null;
public void createThread(int i) {
CallbackThread call = new CallbackThread(i);
call.addListener(this);
Thread t = new Thread(call);
t.start();
}
public void receive(String result) {
this.result = result;
System.out.println(result);
}
public static void main(String[] args) {
//在主函數中創建可以生成線程的類對象
try {
for(int i=0; i<3; i++) {
CreateCallbackThread create = new CreateCallbackThread();
create.createThread(i);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}