我有一個正在運行的線程,它連接到一個web服務器,代碼位於另一個線程上,因爲我不希望程序每次調用代碼時都停止。如何從主線程上的線程調用方法?
雖然在線程中,我需要調用一個方法,但我需要從主線程調用它,不知道是否有任何方法可以做到這一點。
如果我不是很清楚(我敢肯定我是不是XD),然後這裏是一些僞代碼:
thread.start(){
<do webcall stuff>
<call method from main thread>
}
我有一個正在運行的線程,它連接到一個web服務器,代碼位於另一個線程上,因爲我不希望程序每次調用代碼時都停止。如何從主線程上的線程調用方法?
雖然在線程中,我需要調用一個方法,但我需要從主線程調用它,不知道是否有任何方法可以做到這一點。
如果我不是很清楚(我敢肯定我是不是XD),然後這裏是一些僞代碼:
thread.start(){
<do webcall stuff>
<call method from main thread>
}
使用的概念,如布爾值,然後讓你的主線程「注意變化」:
「這樣做的好方法是讓線程的run()由布爾變量保護,並在您想停止它時從外部將其設置爲true,例如:「 - JACK
使用中斷(並定期檢查它)比自己滾動更受歡迎。 – user949300 2014-09-25 19:49:10
@ user949300我有1個疑問。你如何中斷()一個主線程從一個子線程。我應該將線程的對象引用傳遞給我的子線程還是有更好的方法? – 2014-09-25 19:59:07
如果你說你想調用一個方法從這個新線程產生出來。然後將該實例傳遞給要在其上調用方法的對象的新Runnable實現。沒有辦法,你可以直接主線程應該調用特定的方法。
你可以產生新的線程,並從該線程調用你需要的方法。
哦,你可以.Threads可以使用wait()和notify()或通過調用中斷來相互交互 – 2014-09-25 20:03:33
但是然後你被阻塞在一個不希望的線程。 – 2014-09-25 20:12:47
可能的代碼可以是以下幾點:
確保您
public class Program {
volatile static ConcurrentLinkedQueue<MyData> _items = new ConcurrentLinkedQueue<MyData>();
public static void main(String[] args) throws InterruptedException {
Thread thr = new Thread(()->{
System.out.println("Web service called");
_items.add(new MyData()); });
boolean exit = false;
while(!exit) {
while (!_items.isEmpty()) {
MyData item = _items.poll();
//do something with your data
}
Thread.sleep(200);
}
}
您在對象上調用方法,而不是在線程上調用方法。如果你需要從另一個線程中調用某些東西,事情會變得棘手。什麼是你的問題的背景資料,背景?如果這個功能是絕對需要的,我想你可以創建一個某種類型的事件隊列,可能是接受Runnables或Callables的事件隊列,然後從所需的線程遍歷隊列。 – 2014-09-25 19:46:48