日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 线程 函数_java – 从后台线程调用主线程上的函数

發布時間:2024/9/27 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 – 从后台线程调用主线程上的函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。