7

私はtimertaskを使用してJavaプログラムをスケジュールしました。現在、timertaskのrunメソッドが処理中であるときに、同時に実行され、異なる機能を実行する2つのスレッドを実行したいと思います。これが私のコードです..助けてください..

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class timercheck extends TimerTask{
// my first thread
Thread t1 = new Thread(){
     public void run(){
        for(int i = 1;i <= 10;i++)
        {
            System.out.println(i);
        }           
     }
 };

// my second thread
Thread t2 = new Thread(){
     public void run(){
        for(int i = 11;i <= 20;i++)
        {
            System.out.println(i);
        }           
     }
 };

public static void main(String[] args){
      long ONCE_PER_DAY = 1000*60*60*24;

     Calendar calendar = Calendar.getInstance();
     calendar.set(Calendar.HOUR_OF_DAY, 12);
     calendar.set(Calendar.MINUTE, 05);
     calendar.set(Calendar.SECOND, 00);
     Date time = calendar.getTime();

     TimerTask check  = new timercheck();
     Timer timer = new Timer();
     timer.scheduleAtFixedRate(check, time ,ONCE_PER_DAY);
}

@Override    
// run method of timer task
public void run() {
    t1.start();
    t2.start();
}
}
4

2 に答える 2

8

同時に実行され、異なる機能を実行する 2 つのスレッドを実行したいと考えています。

あなたのスレッド「同時に」実行されていると思います。しかし、競合状態のため、最初のスレッドは 2 番目のスレッドの前に出力をキューに入れているだけです。スレッド 1 からの 1 行とスレッド 2 からの 1 行は表示されません。スレッドのスケジューリングに応じて、あるブロックから別のブロックが表示されます。

出力の量を 10 行から (たとえば) 1000 行に増やすと、両方がインターレース出力で同時に実行されていることがわかります。

于 2012-11-07T04:29:11.067 に答える
4

両方のスレッドを同時に開始したい場合は、CountDownLatch を使用してください。

上記のコードがあるため、t1 は t2 の前に実行 (Runnable) の対象になります。したがって、t1 と t2 を混在させるか、最初に t1 を終了してから t2 を終了するかを選択するのは、Java スケジューラ次第です。しかし、t1 と t2 の両方にキューの実行開始を待機させたい場合は、CountDownLatch が役立ちます。

public class timercheck extends TimerTask{

private final CountDownLatch countDownLatch  = new CountDownLatch(1);

    // my first thread
    Thread t1 = new Thread(){
         public void run(){

            countDownLatch.await();  

            for(int i = 1;i <= 10;i++)
            {
                System.out.println(i);
            }           
         }
     };

    // my second thread
    Thread t2 = new Thread(){

         public void run(){

            countDownLatch.await();

            for(int i = 11;i <= 20;i++)
            {
                System.out.println(i);
            }           
         }
     };

        public void run() {
            t1.start();
            t2.start();
            countDownLatch.countDown();
        }

CountDownLatch、Semaphore、および CyclicBarrier の詳細については、この投稿を参照してください。

于 2012-11-07T04:48:25.783 に答える