Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
import javax.swing.plaf.TableHeaderUI; import java.awt.geom.AffineTransform; import java.lang.invoke.SwitchPoint; import java.util.concurrent.Semaphore; import java.util.*; public class Vinegar { public static void main(String args[]) throws InterruptedException{ init(); HashSet
threads = new HashSet<>(); for (int i = 0; i < 20; i++) { threads.add(new C()); threads.add(new H()); threads.add(new H()); threads.add(new O()); } for(int i = 0; i < 20; i++) { threads.add(new H()); } // run all threads in background for(Thread t : threads) { t.start(); } for(Thread t : threads) { t.join(2000); } for(Thread t : threads) { if(t.isAlive()) { System.out.println("Possible deadlock!"); return; } } // after all of them are started, wait each of them to finish for maximum 2_000 ms // for each thread, terminate it if it is not finished System.out.println("Process finished."); } 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 { // at most 2 atoms should print this in parallel c.acquire(1); System.out.println("C here."); c_created.release(6); h_created.acquire(1); o_created.acquire(1); // after all atoms are present, they should start with the bonding process together System.out.println("Molecule bonding."); Thread.sleep(100);// this represent the bonding process boss.release(6); System.out.println("C done."); // only one atom should print the next line, representing that the molecule is created c.release(1); System.out.println("Molecule created."); } @Override public void run() { try { excecute(); } catch (InterruptedException e) { } } } static class H extends Thread { private void excecute() throws InterruptedException{ // at most 4 atoms should print this in parallel System.out.println("H here."); h.acquire(1); // after all atoms are present, they should start with the bonding process together c_created.acquire(1); h_created.release(4); o_created.acquire(1); System.out.println("Molecule bonding."); Thread.sleep(100);// this represent the bonding process boss.acquire(1); System.out.println("H done."); // only one atom should print the next line, representing that the molecule is created h.release(); System.out.println("Molecule created."); } @Override public void run() { try { excecute(); } catch (InterruptedException e) { } } } static class O extends Thread { private void excecute() throws InterruptedException{ // at most 2 atoms should print this in parallel o.acquire(1); System.out.println("O here."); // after all atoms are present, they should start with the bonding process together c_created.acquire(1); h_created.acquire(1); o_created.release(6); System.out.println("Molecule bonding."); Thread.sleep(100);// this represent the bonding process boss.acquire(1); System.out.println("O done."); // only one atom should print the next line, representing that the molecule is created o.release(1); System.out.println("Molecule created."); } @Override public void run() { try { excecute(); } catch (InterruptedException e) { } } } }
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)