запустите два потока одновременно в java

я использовал timertask для планирования моей java-программы. теперь, когда метод run timertask находится в процессе, я хочу запустить два потока, которые работают одновременно и выполняют разные функции. вот мой код.. пожалуйста, помогите мне..

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();
}
}

2 ответов


Я думаю, ваши темы are работает в то же время. Но из-за условий гонки первый поток просто выстраивается в очередь перед вторым. Вы не увидите одну строку из thread-1, а затем 1 строку из thread-2. Вы увидите блоки из одного, а затем из другого в зависимости от планирования потока.

Если вы увеличите объем вывода с 10 строк до (например) 1000, вы увидите, что они работают одновременно с чересстрочными выход.


используйте CountDownLatch, если вы хотите запустить оба потока одновременно.

поскольку у вас есть приведенный выше код, t1 имеет право на запуск (запуск) до t2. Так что до Ява планировщик для выбора смесителя T1 и T2 или T1 конца сначала, а потом Т2. Но если вы хотите, чтобы 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, семафоре и CyclicBarrier читать этой пост.