Использование CycleBarrier для двух объектов с разным количеством потоков
У меня под рукой следующая задача:
Представьте, что есть 4 разработчика, которые реализуют функции для ИТ-решения, и 2 тестировщика для проверки их работы. Менеджер проекта разрабатывает (дискуссионную) стратегию для этого проекта: он не хочет, чтобы тестировщики запускали проверку этого приложения, пока все разработчики не завершат свою работу. Кроме того, он не хочет, чтобы разработчики начали исправлять обнаруженные дефекты (изменяя приложение) до того, как все тестировщики завершат свою работу. Для координации этих задач используйте класс CyclicBarrier.
После некоторых исследований и учебных пособий мне удалось скомпилировать следующий код для работы с 2 потоками для каждого CycleBarrier:
public static void main(String[] args) {
Runnable barrier1Action = new Runnable() {
public void run() {
System.out.println("Developers start working -> Testers start working");
}
};
Runnable barrier2Action = new Runnable() {
public void run() {
System.out.println("Testers finish working -> Developers start fixing defects");
}
};
CyclicBarrier barrier1 = new CyclicBarrier(2, barrier1Action);
CyclicBarrier barrier2 = new CyclicBarrier(2, barrier2Action);
CyclicBarrierRunnable barrierRunnable1 = new CyclicBarrierRunnable(barrier1, barrier2);
CyclicBarrierRunnable barrierRunnable2 = new CyclicBarrierRunnable(barrier1, barrier2);
new Thread(barrierRunnable1).start();
new Thread(barrierRunnable2).start();
и класс CyclicBarrierRunnable:
public class CyclicBarrierRunnable implements Runnable {
CyclicBarrier barrier1 = null;
CyclicBarrier barrier2 = null;
public CyclicBarrierRunnable(CyclicBarrier barrier1, CyclicBarrier barrier2) {
this.barrier1 = barrier1;
this.barrier2 = barrier2;
}
public void run() {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " waiting at barrier 1");
this.barrier1.await();
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " waiting at barrier 2");
this.barrier2.await();
System.out.println(Thread.currentThread().getName() + " done!");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
У меня вопрос, как я могу заставить приложение работать, если первый CyclicBarrier имеет 4 участника вместо 2. Если я пытаюсь запустить его с CyclicBarrier barrier1 = new CyclicBarrier(4, barrier1Action);
CyclicBarrier barrier2 = new CyclicBarrier(2, barrier2Action);
только первые 2 темы начнутся
1 ответ
Во-первых, дизайн кажется неправильным, поскольку разработчики и тестировщики отличаются друг от друга в своей работе, лучше создать два класса, которые реализуют Runnable, а вместо CyclicBarrier использовать CountDownLatch. Пример примера на основе ваших требований:
import java.util.concurrent.CountDownLatch;
public class DevTest {
static class Developer implements Runnable {
CountDownLatch waitingForDeveloper=null;
CountDownLatch waitingForTester =null;
public Developer(CountDownLatch waitingForDeveloper,CountDownLatch waitingForTester) {
this.waitingForDeveloper=waitingForDeveloper;
this.waitingForTester=waitingForTester;
}
@Override
public void run(){
System.out.println("Dev "+Thread.currentThread().getName()+" has completed the task");
waitingForDeveloper.countDown();
try{
waitingForTester.await();
}catch(InterruptedException ex){}
System.out.println("Dev "+Thread.currentThread().getName()+" is Working on the bug raised by testers.");
}
}
static class Tester implements Runnable {
CountDownLatch waitingForDeveloper=null;
CountDownLatch waitingForTester =null;
public Tester(CountDownLatch waitingForDeveloper,CountDownLatch waitingForTester) {
this.waitingForDeveloper=waitingForDeveloper;
this.waitingForTester=waitingForTester;
}
@Override
public void run(){
try{
waitingForDeveloper.await();
}catch(InterruptedException ex){}
System.out.println("Tester "+Thread.currentThread().getName()+" has completed testing.");
waitingForTester.countDown();
}
}
public static void main(String[] args) {
int noOFdevelopers=7;
int noOFTesters=4;
CountDownLatch waitingForDeveloper=new CountDownLatch(noOFdevelopers);
CountDownLatch waitingForTester =new CountDownLatch(noOFTesters);
Developer developer=new Developer(waitingForDeveloper, waitingForTester);
Tester tester=new Tester(waitingForDeveloper, waitingForTester);
for(int i=1;i<=noOFTesters;i++){
new Thread(tester,""+i).start();
}
for(int i=1;i<=noOFdevelopers;i++){
new Thread(developer,""+i).start();
}
}
}
Разобравшись с этим фрагментом, вы можете попробовать свои подходы к проблеме.
Надеюсь, это поможет!!!