fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.concurrent.TimeUnit;
  9. import java.util.concurrent.atomic.AtomicBoolean;
  10.  
  11. /* Name of the class has to be "Main" only if the class is public. */
  12. class Ideone
  13. {
  14. public static void main(String[] args) throws InterruptedException {
  15. Car[] cars = new Car[]{
  16. new Car("Honda"),
  17. new Car("AMG"),
  18. new Car("Ford"),
  19. new Car("Nissan")
  20. };
  21.  
  22. final Spot[] spots = new Spot[]{
  23. new Spot(1),
  24. new Spot(2),
  25. new Spot(3)
  26. };
  27.  
  28. List<Thread> threads = new ArrayList<>();
  29.  
  30. for (final Car c : cars){
  31. final Runnable r = new Runnable() {
  32. @Override
  33. public void run() {
  34. try {
  35. c.go(spots);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. };
  41.  
  42. final Thread t = new Thread(r);
  43. threads.add(t);
  44. t.start();
  45. }
  46.  
  47. Thread.sleep(TimeUnit.SECONDS.toMillis(5));
  48.  
  49. for(Thread t : threads){
  50. t.interrupt();
  51. }
  52. }
  53.  
  54. public static class Spot {
  55. public final AtomicBoolean occupied = new AtomicBoolean(false);
  56. public final int id;
  57.  
  58. public Spot(int id) {
  59. this.id = id;
  60. }
  61. }
  62.  
  63. public static class Car {
  64. private final String name;
  65.  
  66. public Car(String name) {
  67. this.name = name;
  68. }
  69.  
  70. public void go(Spot[] spots) throws InterruptedException {
  71. int i = 0;
  72. while (!Thread.interrupted()){
  73. Spot s = spots[i];
  74. if(s.occupied.compareAndSet(false,true)){
  75. use(s);
  76. }else {
  77. i++;
  78. i = i >= spots.length ? 0 : i;
  79. }
  80. }
  81. }
  82.  
  83. private void use(Spot spot) throws InterruptedException {
  84. System.out.println(String.format("Car %s parked @ spot %d.",name,spot.id));
  85. Thread.sleep((long) (Math.random()*1000));
  86. spot.occupied.set(false);
  87. System.out.println(String.format("Car %s left @ spot %d.",name,spot.id));
  88. }
  89. }
  90. }
Time limit exceeded #stdin #stdout 5s 321792KB
stdin
Standard input is empty
stdout
Car Honda parked @ spot 1.
Car AMG parked @ spot 2.
Car Ford parked @ spot 3.
Car AMG left @ spot 2.
Car Nissan parked @ spot 2.
Car Ford left @ spot 3.
Car Ford parked @ spot 3.
Car Ford left @ spot 3.
Car AMG parked @ spot 3.
Car Honda left @ spot 1.
Car Ford parked @ spot 1.
Car Nissan left @ spot 2.
Car Honda parked @ spot 2.
Car AMG left @ spot 3.
Car Nissan parked @ spot 3.
Car Nissan left @ spot 3.
Car Nissan parked @ spot 3.
Car Honda left @ spot 2.
Car Honda parked @ spot 2.
Car Ford left @ spot 1.
Car Ford parked @ spot 1.
Car Nissan left @ spot 3.
Car Nissan parked @ spot 3.
Car Honda left @ spot 2.
Car AMG parked @ spot 2.
Car Nissan left @ spot 3.
Car Nissan parked @ spot 3.
Car AMG left @ spot 2.
Car AMG parked @ spot 2.
Car Ford left @ spot 1.
Car Honda parked @ spot 1.
Car Nissan left @ spot 3.
Car Ford parked @ spot 3.
Car AMG left @ spot 2.
Car AMG parked @ spot 2.
Car Honda left @ spot 1.
Car Honda parked @ spot 1.
Car Ford left @ spot 3.
Car Nissan parked @ spot 3.
Car Nissan left @ spot 3.
Car Ford parked @ spot 3.
Car Ford left @ spot 3.
Car Nissan parked @ spot 3.
Car Honda left @ spot 1.
Car Honda parked @ spot 1.
Car AMG left @ spot 2.
Car AMG parked @ spot 2.
Car Honda left @ spot 1.
Car Ford parked @ spot 1.
Car Nissan left @ spot 3.
Car Nissan parked @ spot 3.