java 线程 函数_java – 从后台线程调用主线程上的函数
更新
我已經(jīng)更新了這個(gè)問題,使用建議的SwingWorker類包含Java實(shí)現(xiàn)的源代碼,以實(shí)現(xiàn)與Objective-C示例相同的結(jié)果.希望這將有助于未來的冒險(xiǎn)家.
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();
原帖
在并發(fā)編程方面,我缺乏經(jīng)驗(yàn),我希望有人能夠向我解釋如何實(shí)現(xiàn)這一目標(biāo).
在Objective-C(使用GCD)中,您可以執(zhí)行以下操作:
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];
});
});
此代碼將在后臺(tái)線程中執(zhí)行[myDoc analyze],在回調(diào)函數(shù)之后更新將在主線程中執(zhí)行的UI.換句話說,后臺(tái)線程向主線程發(fā)送一個(gè)中斷,將匿名函數(shù)添加到要調(diào)用的主線程隊(duì)列中.顯然我不能在Java中使用匿名函數(shù),但這不是重點(diǎn).
我有興趣在Java中做這件事.我有一個(gè)Runnable對(duì)象,它在文件系統(tǒng)中做了很多東西.完成后,我想相應(yīng)地更新UI.
為了在執(zhí)行此操作時(shí)不掛起主線程(即:backgroundThread.join();),我設(shè)置了后臺(tái)線程來執(zhí)行回調(diào)函數(shù)來更新UI.但這不是一個(gè)好主意,我不希望非GUI線程更新GUI.
我想到的其他一些想法是投票,但這似乎是拋出窗口的循環(huán).根據(jù)同樣的判斷,使用期貨似乎也不是答案.這一切似乎都打敗了異步操作的目的.
我能想到的唯一另一件事是從后臺(tái)線程使用SwingUtilities.invokeLater并使用它來更新GUI.但我很好奇這將執(zhí)行哪個(gè)線程.
也許我的看法只是扭曲了,但這似乎是一個(gè)非常重要的部分.我只是想以錯(cuò)誤的方式解決這個(gè)問題嗎?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java 线程 函数_java – 从后台线程调用主线程上的函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 等待读取完毕 java_java – 等
- 下一篇: 如何设置计算机http端口号,服务器ht