i have used timertask to schedule my java program. now when the run method of timertask is in process, i want to run two threads which run at the same time and do different functions. here is my code.. please help me..
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();
}
}
Multithreading in Java is a process of executing two or more threads simultaneously to maximum utilization of CPU. Multithreaded applications execute two or more threads run concurrently. Hence, it is also known as Concurrency in Java. Each thread runs parallel to each other.
In the same multithreaded process in a shared-memory multiprocessor environment, each thread in the process can run concurrently on a separate processor, resulting in parallel execution, which is true simultaneous execution.
In order to create a Thread, first we need to create an Instance of RunnableWorker which implements the Runnable Interface. The above code creates a Runnable Instance r. Then it create 3 threads t1, t2 and t3 and passes r as the argument to the 3 threads. Then the start() function is used to start all the 3 threads.
i want to run two threads which run at the same time and do different functions.
I think your threads are running at the "same" time. But because of race conditions, the first thread is just queueing its output before the 2nd. You will not see one line from thread-1 and then 1 line from thread-2. You will see blocks from one and then the other depending on the thread scheduling.
If you increase the amount of output from 10 lines to (for example) 1000, you should see that they are both running concurrently with interlaced output.
Make use of a CountDownLatch if you want to start both threads at the same time.
Since you have the above code t1 becomes eligible to Run (Runnable) before t2. So it is upto Java Scheduler to select whether to intermix t1 and t2 or finish t1 first and then t2. But if you want both t1 and t2 wait for a cue to begin execute, CountDownLatch can help you with that.
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();
}
For more information about CountDownLatch, Semaphore and CyclicBarrier read this post.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With