Guest User

Untitled

a guest
Nov 23rd, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. import java.time.LocalDateTime;
  2. import java.time.format.DateTimeFormatter;
  3. import java.util.Random;
  4. import java.util.concurrent.TimeUnit;
  5. import java.util.concurrent.locks.Lock;
  6.  
  7. public class Philosopher implements Runnable {
  8. private String name;
  9. private final Lock leftFork;
  10. private final Lock rightFork;
  11.  
  12. public Philosopher(String name, Lock leftFork, Lock rightFork) {
  13. this.name = name;
  14. this.leftFork = leftFork;
  15. this.rightFork = rightFork;
  16. }
  17.  
  18. public void think() {
  19. log("thinking");
  20. }
  21.  
  22. public void eat() {
  23. //assume, eating requires some time.
  24. //let's put a random number
  25. try {
  26. log("eating");
  27. int eatingTime = getRandomEatingTime();
  28. TimeUnit.NANOSECONDS.sleep(eatingTime);
  29. } catch (InterruptedException e) {
  30. Thread.currentThread().interrupt();
  31. }
  32. }
  33.  
  34. @Override
  35. public void run() {
  36. while (true) {
  37. keepThinkingAndEating();
  38. }
  39. }
  40.  
  41. private void keepThinkingAndEating() {
  42. think();
  43.  
  44. if (leftFork.tryLock()) {
  45. try {
  46. log("grabbed left fork");
  47. if (rightFork.tryLock()) {
  48. try {
  49. log("grabbed right fork");
  50. eat();
  51. } finally {
  52. log("put down right fork");
  53. rightFork.unlock();
  54. }
  55. }
  56. } finally {
  57. log("put down left fork");
  58. leftFork.unlock();
  59. }
  60. }
  61. }
  62.  
  63. private void log(String msg) {
  64. DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_TIME;
  65. String time = formatter.format(LocalDateTime.now());
  66. String thread = Thread.currentThread().getName();
  67. System.out.printf("%12s %s %s: %s%n", time, thread, name, msg);
  68. System.out.flush();
  69. }
  70.  
  71. private int getRandomEatingTime() {
  72. Random random = new Random();
  73. return random.nextInt(500) + 50;
  74. }
  75. }
  76.  
  77. import java.util.concurrent.ExecutorService;
  78. import java.util.concurrent.Executors;
  79. import java.util.concurrent.locks.Lock;
  80. import java.util.concurrent.locks.ReentrantLock;
  81.  
  82. public class PhilosopherMain {
  83. public static void main(String[] args) {
  84. Lock[] forks = new Lock[5];
  85. for (int i = 0; i < forks.length; i++) {
  86. forks[i] = new ReentrantLock();
  87. }
  88.  
  89. Philosopher[] philosophers = new Philosopher[5];
  90.  
  91. ExecutorService executorService = Executors.newFixedThreadPool(5);
  92.  
  93. for (int i = 0; i < philosophers.length; i++) {
  94. Lock leftFork = forks[i];
  95. Lock rightFork = forks[(i + 1) % forks.length];
  96. philosophers[i] = new Philosopher("Philosopher " + (i + 1), leftFork, rightFork);
  97. executorService.execute(philosophers[i]);
  98. }
  99.  
  100. executorService.shutdown();
  101. }
  102. }
Add Comment
Please, Sign In to add comment