java 线程 函数_java – 从后台线程调用主线程上的函数
更新
我已經更新了這個問題,使用建議的SwingWorker類包含Java實現的源代碼,以實現與Objective-C示例相同的結果.希望這將有助于未來的冒險家.
Document myDoc = ...;
Model myModel = ...;
SwingWorker analyzeDocument = new SwingWorker() {
@Override
public Dictionary doInBackground() {
return myDoc.analyze();
}
@Override
public void done() {
try {
stats = get();
myModel.setDict(stats);
myModel.setNeedsDisplay(true);
} catch(InterruptedException ex) {
// log
} catch(ExecutionException ex) {
// log
}
}
};
analyzeDocument.execute();
原帖
在并發編程方面,我缺乏經驗,我希望有人能夠向我解釋如何實現這一目標.
在Objective-C(使用GCD)中,您可以執行以下操作:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
NSDictionary *stats = [myDoc analyze];
dispatch_async(dispatch_get_main_queue(), ^{
[myModel setDict:stats];
[myStatsView setNeedsDisplay:YES];
[stats release];
});
});
此代碼將在后臺線程中執行[myDoc analyze],在回調函數之后更新將在主線程中執行的UI.換句話說,后臺線程向主線程發送一個中斷,將匿名函數添加到要調用的主線程隊列中.顯然我不能在Java中使用匿名函數,但這不是重點.
我有興趣在Java中做這件事.我有一個Runnable對象,它在文件系統中做了很多東西.完成后,我想相應地更新UI.
為了在執行此操作時不掛起主線程(即:backgroundThread.join();),我設置了后臺線程來執行回調函數來更新UI.但這不是一個好主意,我不希望非GUI線程更新GUI.
我想到的其他一些想法是投票,但這似乎是拋出窗口的循環.根據同樣的判斷,使用期貨似乎也不是答案.這一切似乎都打敗了異步操作的目的.
我能想到的唯一另一件事是從后臺線程使用SwingUtilities.invokeLater并使用它來更新GUI.但我很好奇這將執行哪個線程.
也許我的看法只是扭曲了,但這似乎是一個非常重要的部分.我只是想以錯誤的方式解決這個問題嗎?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java 线程 函数_java – 从后台线程调用主线程上的函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 等待读取完毕 java_java – 等
- 下一篇: 如何设置计算机http端口号,服务器ht