запустите два потока одновременно в 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 читать этой пост.