Продолжаем серию задач по многопоточности. Сегодня задача посложнее предыдущей. Которая решалась изменением 2-х строчек кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | /** * Как сделать так, чтобы потоки вызывались по очереди? * * Часто необходимо упорядочить потоки, т.к. результат одного потока * понадобится другому, и нужно дождаться, когда первый поток сделает свою работу. * * Задача: добавьте еще один поток, который будет выводить в лог сообщения о * значениях счетчика, кратных 10, например 10, 20, 30... * При этом такие сообщения должны выводиться после того, как все потоки преодолели * кратность 10, но до того, как какой-либо поток двинулся дальше. */ public class WaitTutor { Thread t1, t2; Object monitor = new Object(); int runningThreadNumber = 1; int t1Counter = 0, t2Counter = 0; //int maxCounter = 0; class TestThread implements Runnable { String threadName; int n; public TestThread(String threadName, int n) { this.threadName = threadName; this.n = n; } @Override public void run() { for (int i=0;i<100;i++) { System.out.println(threadName+":"+i); synchronized(monitor) { if (n==1) t1Counter = i; if (n==2) t2Counter = i; monitor.notify(); Thread.yield(); try { if (n==1) { if (i>t2Counter) { System.out.println("t1 is ahead with i="+i+", wait for t2Counter="+t2Counter); monitor.wait(); } } if (n==2) { if (i>t1Counter) { System.out.println("t2 is ahead with i="+i+", wait for t1Counter="+t1Counter); monitor.wait(); } } } catch (InterruptedException e) { e.printStackTrace(); } } Thread.yield(); } } } @Test public void testThread() { t1 = new Thread(new TestThread("t1", 1)); t2 = new Thread(new TestThread("t2", 2)); System.out.println("Starting threads"); t1.start(); t2.start(); System.out.println("Waiting for threads"); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } |
Подарочек все еще в силе, решаем и высылаем результаты!
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.