RosettaCodeData/Task/Checkpoint-synchronization/Java/checkpoint-synchronization-...

49 lines
1.3 KiB
Java

import java.util.Random;
import java.util.concurrent.CountDownLatch;
public class Sync {
static class Worker implements Runnable {
private final CountDownLatch doneSignal;
private int threadID;
public Worker(int id, CountDownLatch doneSignal) {
this.doneSignal = doneSignal;
threadID = id;
}
public void run() {
doWork();
doneSignal.countDown();
}
void doWork() {
try {
int workTime = new Random().nextInt(900) + 100;
System.out.println("Worker " + threadID + " will work for " + workTime + " msec.");
Thread.sleep(workTime); //work for 'workTime'
System.out.println("Worker " + threadID + " is ready");
} catch (InterruptedException e) {
System.err.println("Error: thread execution interrupted");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int n = 3;//6 workers and 3 tasks
for(int task = 1; task <= n; task++) {
CountDownLatch latch = new CountDownLatch(n * 2);
System.out.println("Starting task " + task);
for(int worker = 0; worker < n * 2; worker++) {
new Thread(new Worker(worker, latch)).start();
}
try {
latch.await();//wait for n*2 threads to signal the latch
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + task + " complete");
}
}
}