1

私の問題に対する適切な答えが見つからないようです: フォームのランナブルが一定量あるとします。

public class NeverendingRunner implements Runnable {

//...

@Override
public void run() {
    while(true){
        //Do what you have to do

        //At the end of the iteration, get back in queue
    }
}

スレッドプールを使用してこれらを実行すると、明らかに実行から離れることはありません。イテレーションの最後にコメントしたように、それらをスケジュールしたいと思います。

EG: 無限ループを持つ 2 つの Runnables (そして、実行するタスクに対して無限である必要があります) と 1 つのスレッドのトレッドプール (簡単にするため) があります。これらの 2 つのループで、スレッドの使用法を交互に切り替えたいと考えています。Runnables はお互いを知りません。

これが可能かどうかはわかりません。

助けや提案をありがとう

編集: Jost ソリューションは、私が目指していたスケーラビリティを提供する問題を解決しました。ありがとうございました。

4

5 に答える 5

3

ThreadPoolExecutorを使用し、無限ループを削除し、2 つの Runnables がエグゼキューターに再スケジュールできるようにする必要があると思います。このコード スニペットが役立つ場合があります。

public class Task implements Runnable
{
    private ReentrantLock lock;
    private ExecutorService executor;

    public Task(ExecutorService executor)
    {
        this.executor=executor;
    }

    @Override
    public void run()
    {

        //do some stuff
        //...

        lock.lock();
        executor.execute(this);
        lock.unlock();
    }
}

注: この例は試していませんが、一般的にはうまくいくはずです。ロックにより、エグゼキューターが終了する前に開始しないことが保証されますrun()(少し奇妙に聞こえますが、プール内に複数のスレッドがある場合には理にかなっています)。

*ジョスト

于 2013-07-16T11:27:39.953 に答える
1

だいたいこんなの想像できる

    final Runnable task1 = new Runnable() {
        public void run() {
            for(int i = 0; i < 10; i++) {
                System.out.println("task1");
            }
        }
    };
    final Runnable task2 = new Runnable() {
        public void run() {
            for(int i = 0; i < 10; i++) {
                System.out.println("task2");
            }
        }
    };
    new Thread() {
        public void run() {
            for(;;) {
                task1.run();
                task2.run();
            }
        };
    }.start();
于 2013-07-16T11:07:06.377 に答える
0

ファイルDataflowVariableの loopAct() メソッドを参照してください。あなたのケースではオーバーヘッドですが、アイデアは簡単です。タスクが機能しているかどうかを示すブール変数を保持します。タスクがすべてのジョブを終了すると、変数をオフにして終了します。別のスレッドがタスクにジョブを提供し、変数がそれが機能していないことを示している場合、変数をオンにしてタスクをエグゼキューターに送信します。この方法では、タスクが複数のスレッドによって同時に実行されることはありません。

于 2013-07-16T14:56:03.967 に答える
0

以下のコードはこれを達成するかもしれませんが、最良の実装ではありません

CyclicBarrier run1 = new CyclicBarrier(2);
CyclicBarrier run2 = new CyclicBarrier(2);

public class RUN1 implements Runnable {

@Override
public void run() {
    while(true){
        //Do what you have to do
        //At the end of the iteration, get back in queue
         run1.await();
         run2.await();
    }
}
}

public class RUN2 implements Runnable {

@Override
public void run() {
    while(true){
         run1.await();
        //Do what you have to do
        //At the end of the iteration, get back in queue
         run2.await();
    }
}
}
于 2013-07-16T11:09:57.547 に答える