import java.awt.geom.AffineTransform;
import java.lang.invoke.SwitchPoint;
import java.util.concurrent.Semaphore;
import java.util.*;
public class Main {
public static void main(String args[]) {
init();
List c_atoms = new ArrayList<>();
List h_atoms = new ArrayList<>();
List o_atoms = new ArrayList<>();
for(int i = 0; i < 20; i++) {
c_atoms.add(new C());
}
for(int i = 0; i < 40; i++) {
h_atoms.add(new H());
}
for(int i = 0; i < 20 ;i++) {
o_atoms.add(new O());
}
for(int i = 0; i < 20 ; i++) {
c_atoms.get(i).start();
}
for(int i = 0; i < 40; i++) {
h_atoms.get(i).start();
}
for(int i = 0; i < 20 ;i++) {
o_atoms.get(i).start();
}
try {
for(int i = 0; i < 20 ; i++) {
c_atoms.get(i).join();
}
for(int i = 0; i < 40; i++) {
h_atoms.get(i).join();
}
for(int i = 0; i < 20 ;i++) {
o_atoms.get(i).join();
}
}
catch (InterruptedException e) {
}
}
static Semaphore c;
static Semaphore h;
static Semaphore o;
static Semaphore c_created;
static Semaphore h_created;
static Semaphore o_created;
static Semaphore boss;
private static void init() {
c = new Semaphore(2);
h = new Semaphore(4);
o = new Semaphore(2);
c_created = new Semaphore(0);
h_created = new Semaphore(0);
o_created = new Semaphore(0);
boss = new Semaphore(0);
}
static class C extends Thread {
private void excecute() throws InterruptedException {
c.acquire(1);
c_created.release(6);
h_created.acquire(1);
o_created.acquire(1);
boss.release(6);
System.out.println("C bonding");
c.release(1);
}
@Override
public void run() {
try {
excecute();
} catch (InterruptedException e) {
}
}
}
static class H extends Thread {
private void excecute() throws InterruptedException{
h.acquire(1);
c_created.acquire(1);
h_created.release(4);
o_created.acquire(1);
boss.acquire(1);
System.out.println("H bonding");
h.release();
}
@Override
public void run() {
try {
excecute();
}
catch (InterruptedException e) {
}
}
}
static class O extends Thread {
private void excecute() throws InterruptedException{
o.acquire(1);
c_created.acquire(1);
h_created.acquire(1);
o_created.release(6);
boss.acquire(1);
System.out.println("O bonding");
o.release(1);
}
@Override
public void run() {
try {
excecute();
}
catch (InterruptedException e) {
}
}
}
}