線程的回調設計

在使用線程時,我們有時需要獲得線程的計算結果,但是,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();
}


}

}

發佈了16 篇原創文章 · 獲贊 5 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章