1

どうすればそのようなコードを機能させることができますか?

public void start()
{
    ThreadPoolManager.getInstance().scheduleWithFixedDelay(new Thread(), 1000, 1000);
}

public class Thread implements Runnable
{
    int i = 0;
    @Override
    public void run()
    {
        i++;
        if(i==5)
            //TODO stop this thread
    }
}

i==5の後にスレッドを停止したい

編集:それは次のように行うことができます:

public void start()
{
    ThreadPoolManager.getInstance().schedule(new Thread(), 1000);
}

public class Thread implements Runnable
{
    int i = 0;
    @Override
    public void run()
    {
        while(i!=5)
        {
            i++;
            try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
        }
    }
}

しかし、それでも誰かがscheduleWithFixedDelayでそれを作る方法を知っているなら、私は答えを知ってうれしいです:)

4

2 に答える 2

1

タスクをそれ自体から停止するのScheduledThreadPoolExecutorは、もう少し複雑です。ScheduledFutureをタスク自体に戻して呼び出すこともできますcancel(スレッドセーフではありませんが、1000 ミリ秒の遅延があるため、十分なはずです)。

public void start()
{
    Task t = new Task();
    ScheduledFuture sf = ThreadPoolManager.getInstance().scheduleAtFixedDelay(t, 1000, 1000);
    t.setFuture(sf);
}

class Task implements Runnable {

    private int i = 0;
    private ScheduledFuture sf;

    public void setFuture(ScheduledFuture sf) {
        this.sf = sf;
    }

    public void run() {
        i++;
        if(i==5)
            sf.cancel(true);
    }
}
于 2012-09-08T13:16:41.887 に答える
0

あなたはただ使うことができますthis.stop()

編集:FixedDelay-ingを維持することに気付かなかったので:

public void start()
{
    ThreadPoolManager.getInstance().scheduleAtFixedDelay(new Thread(new MyThread()), 1000, 1000);
}

public class MyThread implements Runnable
{
    int i = 0;
    boolean keepGoing = true;
    @Override
    public void run()
    {
        if (keepGoing)
        {
            i++;
            System.out.println("Thread in " + i);
            if(i==5)
                keepGoing = false;
        }
    }
}
于 2012-09-08T13:15:18.710 に答える