何が最良の方法を返す変数からsyncExec?
-
09-06-2019 - |
質問
私のSWT Javaアプリをよくしたいから情報を返す内に表示されます。syncExecていました。最良の方法がその場で発音を確認することがこれまでには:
final ArrayList<Integer> result = new ArrayList<Integer>();
GUI.display().syncExec(new Runnable(){ public void run() {
MessageBox mb = /* ... */;
/* set up messagebox */
result.add(mb.open());
}});
if (SWT.OK == result.get(0)) { /* ... */ }
と思うことが可能でArrayListはスレッドセーフですが、そのより良いコンテナかるべき使用でき。
解決
ArrayList
はスレッドセーフではありません.取得することができますスレッドセー List
と Collections.synchronizedList
.しかし、より簡単な使用 AtomicInteger
お場合または AtomicReference
一般的。
final AtomicInteger resultAtomicInteger = new AtomicInteger();
Display.getCurrent().syncExec(new Runnable() {
public void run() {
MessageBox mb = /* ... */;
/* set up messagebox */
resultAtomicInteger.set(mb.open());
}});
if (SWT.OK == resultAtomicInteger.get()) { /* ... */ }
他のヒント
私が取り組むことでこの問題は、私の初めての試みた類似の配列またはリストの希望タイプです。なったもののようになります:
abstract class MyRunnable<T> implements Runnable{
T result;
}
MyRunnable<Integer> runBlock = new MyRunnable<Integer>(){
MessageBox mb = /* ... */;
/* set up messagebox */
result = mb.open();
}
GUI.display().syncExec(runBlock);
runBlock.result; //holds a result Integer
かtidierおよび削除します冗長変数です。
ちなみ.私も初めてみたで使UIThreadRunnableがんSWTBotの依存関係は、い落とす事ができます。後の私自社ソリューションを見つけ、彼らを用いて周辺にあります。
ArrayListは ない スレッドセーフです。から、当該 Javadoc:
この実装はしない 同期化されます。複数のスレッド アクセスArrayListインスタンス 同時に、少なくとも一つの スレッド変更のリスト 構造的に動するのは、 外部で
が必要な場合は、スレッドの安全な実装のリストによると、少なくとも)二つのJDK:CopyOnWriteArrayList、ベクトルとなっています。
を使用できる整数[1]配列になるよう、簡潔とは言えないように思いで直接更新non-final変数の中から匿名の内部クラスです。
final Integer[] result = new Integer[1];
と思っていたのを宣言するのに結果として最終のものに変化するかに影響のあるコードとします。以来、現在のスレッドまでブロック内のスレッドが終了しないほうがいいと思いま悩む必要は同期が必要がある場合がありますの変数に違反でありがとうございますの結果が出ています。
このような場合はしばしば、よりよい利用登録/通知モデルとプロセスす。お参加のイベントをトリガするメッセージボックス取得時に通知条件を満たすものに