Run two threads simultaneously in java

I used timertask to plan my java program. now that the timertask start method is running, I want to start two threads that start at the same time and perform 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(); } } 
+4
source share
2 answers

I think your threads are running at the same time. But due to race conditions, the first stream simply queues its way out until the 2nd. You will not see a single line from stream-1, and then 1 line from stream-2. You will see blocks from one and then the other depending on the flow planning.

If you increase the output from 10 lines to (for example) 1000, you should see that they both work simultaneously with interlaced output.

+6
source

Use CountDownLatch if you want to start both threads simultaneously.

Since you have the above code, t1 gets the right to run (Runnable) to t2. So, before the Java Scheduler, you can choose whether to mix t1 and t2 or first complete t1 and then t2. But if you want t1 and t2 to wait for the cue to start, CountDownLatch will help you with this.

 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 on CountDownLatch, Semaphore, and CyclicBarrier, read this post.

+1
source

Source: https://habr.com/ru/post/1444506/


All Articles