我已经使用timertask来安排我的java程序。现在当timertask的run方法正在进行时,我想运行两个同时运行并执行不同功能的线程。这是我的代码..请帮帮我..
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();
}
}
答案 0 :(得分:7)
我认为您的线程 在“相同”时间运行。但是由于竞争条件,第一个线程只是在第二个线程之前将其输出排队。你不会从thread-1看到一行,然后从thread-2看到1行。您将看到一个块然后另一个块,具体取决于线程调度。
如果将输出量从10行增加到(例如)1000,您应该看到它们同时与隔行输出一起运行。
答案 1 :(得分:3)
如果要同时启动两个线程,请使用CountDownLatch。
由于你有上面的代码,t1在t2之前就有资格运行(Runnable)。因此,Java Scheduler可以选择是混合t1和t2还是先完成t1然后再完成t2。但是如果你想让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的更多信息,请阅读this帖子。