2
package demo;

import java.util.Timer;
import java.util.TimerTask;

public class Demo {
    public static Timer timer = new Timer();

    static {
        MyTask task = new MyTask();
        timer.schedule(task, 1000);     
    }

    public static void main(String[] args) {
        System.out.println("Begin..."); 

        while (true) {
            // do something         
        }
    }

}

class MyTask extends TimerTask { 
    public void run() {
        // do something 

        MyTask task = new MyTask();
        Demo.timer.schedule(task, 1000);
    }
}

main入っている間はスレッドを一時停止し、TimerTask終了すると再開するにはどうすればよいですか。

4

2 に答える 2

1

ロックを作成し、MyTask が isFinished フラグを設定して lock.notify() を呼び出すまで待ち​​ます。

static Object lock = new Object();
static boolean isFinished;

public static void main(String[] args) throws Exception {
    System.out.println("Begin...");
    synchronized (lock) {
        while (!isFinished) {
            lock.wait();
        }
    }
}

lock.wait() は while ループ内にある必要があることに注意してください。Java は、通知によってのみスレッドが起動されることを保証しません。Object.wait API を参照してください。

于 2013-01-30T07:20:46.697 に答える
0

有用性は、メイン ループの「何かを行う」の実行にかかる時間に依存します。長時間の場合、タイマー タスクは、ループの現在のパスが完了するまで待機する必要があるため、予測できない間隔になります。メイン スレッドは一時停止して、タイマー タスクがループの最後でロックを取得できるようにし、タイマー タスクが完了してロックを解放するまで再開しません。コンストラクターに「true」を渡すと、ロックが「公正」になり、timertask が実行される機会が得られ、メイン ループが無期限にロックを再取得し続けることがなくなります。

また、タイマータスクができない理由については、この記事を参照してください(そうすべきではありませんが、実際にはまだ実行できます...)。 docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

package demo;

import java.util.Timer;
import java.util.TimerTask;

public class Demo {
    public static Timer timer = new Timer();
    public static Lock lock = new ReentrantLock(true);

    static {
        MyTask task = new MyTask();
        timer.schedule(task, 1000);     
    }

    public static void main(String[] args) {
        System.out.println("Begin..."); 

        while (true) {
            lock.lock();
            try {
            // do something
            finally {
              lock.unlock();
            }         
        }
    }

}

class MyTask extends TimerTask { 
    public void run() {
        Demo.lock.lock();
        try {
          // do something

          MyTask task = new MyTask();
          Demo.timer.schedule(task, 1000);
        finally {
            Demo.lock.unlock();
        } 
    }
}
于 2013-01-30T07:30:51.100 に答える