代替spinlock
-
24-09-2019 - |
質問
私は、以下のspinlockアプローチ:
while(!hasPerformedAction()){
//wait for the user to perform the action
//can add timer here too
}
setHasPerformedAction(false);
return getActionPerfomed();
これは、基本的には待機のためのユーザーの行動として返します。現在も要求の答えは、ユーザから続ける前にこのはなぜで入力されます。しかし破壊も修復もおもしろくなことは非効率な場心よりお待ちしていますが(<=30秒までのpcるようにするためのアプリです。その他の選択肢はこのアプローチするロック、セマフォがその構文?
おかげさ
Aly
解決
実は、あってはならないのではないこの非効率なも動作を保証である"起こる前に"端をコードす。作 が起こる前に端 必要なものいずれかの操作を行います:
- アクセスは、揮発性の変動
- Synchronise共有資源
- 利用の兼utilsロックになっています。
て他のコメントは、 最も簡単 溶けるようにするためのフラグは、volatile変数は、あくまで短眠ループを実行します。
しかし、最善のことが同期/wait/通知を共有します。
にする必要のある読み上げている 待 や 通知.より良い説明の使用方法に関しては、読む この記事.例コードの抜粋を以下に示;
1スレッド
Object shared = new Object();
startThread2(shared);
synchronized (shared) {
while (taskNotDone())
shared.wait();
}
スレッド2
// shared was saved at the start of the thread
// do some stuff
markTaskAsDone();
synchronized (shared) {
shared.notify();
}
他のヒント
あなたが書いたことは、あなたがやるべきではありません忙しいループ、と呼ばれています。
あなたはそれをやって維持したいが、少しまだその素晴らしいではないでしょう忙しいルーピング、ではないのと少なくとも睡眠があります:
while( !hasPerformedAction() ) {
(sleep a bit here)
}
それを行うための別の方法は、ブロッキングキュー上のユーザーアクションをエンキューするでしょう:あなたは、単にのqueue.take を使用してすることができ、キューの実装では、あなたのための問題の世話をするだろう
そしてもう一つの方法は、ユーザーのアクションを通知するコールバックを使用することです。
Javaのチュートリアルは、Javaでの同時実行性の良い教訓があります:
http://java.sun.com/docs/books/チュートリアル/不可欠/同時実行/ の
あなたが別のスレッドからUIを変更しようとしている場合は、あなたがやって覚えておきたいでしょう。
SwingUtils.invokeLater(actionToInvoke);
私はアクションがGUIで行われていることを前提としていますので、あなたのタグに GUI あります。
はこの種のものを行うには、「推奨」の方法がスリープ(おそらくwait()
使用)に自分自身を置くためにメインスレッドのためのものであり、アクションが実行された後、GUI操作のために覚醒状態に戻ってそれをnotify()
します。
java.util.concurrent.locks
でそのためのいくつかのクラスがあります。クラスLockSupport
を見てみましょう。
よろしくマイク