2011-02-07 10 views
0

これは私が数回直面したジレンマなので、きれいな解決策は考えられません。ループを維持し、ワーカースレッドを生成するClass1があるとします。私はスレッドがClass1で特定のタスクを実行するためのフラグを設定できるようにします。私が行ってきたのは、静的なAtomicBoolean(フラグ)と、フラグを設定するClass1のpublic staticメソッドです。しかし、これによりClass1の複数のインスタンスを持つことができなくなります。Java並行性、親スレッドのフラグセット

+0

何が行われているかについてもっと知るのに役立ちます。 Unholysamplerの答えは適切かもしれませんが、誰がフラグを設定しますか?Class1、ワーカースレッド、無関係なクラスですか?フラグを確認するのは誰ですか?ワーカースレッドですか?彼らはフラグセットを見ると何をするのですか?クリアフラグとタスクを実行しますか? –

+0

ワーカースレッドが作業を実行できない理由はありますか?タスクを開始したスレッドに作業を戻す必要があるのはなぜですか? –

答えて

4

フラグをクラス変数にしてから、変数を設定して確認するワーカースレッド用のインターフェイスを提供します。

class Owner implements FlagAccess { 
    private AtomicBoolean _flag; 

    public boolean getFlag() { 
    return _flag.get(); 
    } 

    public void setFlag(boolean value) { 
    return _flag.set(value); 
    } 
} 

interface FlagAccess { 
    public boolean getFlag(); 

    public void setFlag(boolean value); 
} 

class Worker extends Thread { 
    private FlagAccess _access; 
    public Worker(FlagAccess access) { 
    _access = access; 
    } 

    public run() { 
    _access.get(); 
    ... 
    _access.set(true); 
    } 
} 
+0

あなたは私をここで打つ。しかし、彼はアトミックブール値を使用しているので、同期は必要ありません。 –

+0

サンプルコードが追加されました。 @ Sergey Tachenov:気づいたので、私はそのコメントを削除しました。 – unholysampler

0

Class1のインスタンスをスレッドに渡すとどうなりますか?したがって、彼らはclass1.doStuff()を呼び出すことができます。

+0

マネージャクラスをワーカーに公開することはあまりクリーンではありません。インターフェイスを提供する方が良いです。 –

+0

私はInterfaceが良い解決策だと思います。+1 – JPelletier

1

簡単な答えは、静的ではないAtomicBooleanをClass1で作成し、Class1への参照またはそのAtomicBooleanへの作業者の作業を渡すように思われます。

(このコードはほとんどの面ではかなり恐ろしいことに注意してください - それはスレッド管理のためのExecutorServiceの使用しませ例えばん)

class Class1 { 

    AtomicBoolean flag; 
    public void spawnTask (IndicatingTask task) { 
     task.setFlagVariable(flag); 
     new Thread(task).start(); 
    } 
} 

interface IndicatingTask extends Runnable { 
    public void setFlagVariable(AtomicBoolean flag); 
} 
+0

フラグへの参照の受け渡しは、クラスへの参照渡しよりも優れています。しかし、そのためのきれいなインターフェースを提供することはさらに優れています。 –

0

をするよりもむしろ「クラス1」に設定されたフラグを持っている - それは返すようにワーカースレッドのために働くだろう結果/ステータス?もしそうなら、未来を労働者に使ってみてください。開始とスレッドの管理には、Executorフレームワークを使用します。

Code examples etc. here - Java Concurrency In Practice