1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| package com.redisc;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.locks.ReentrantLock;
@Slf4j(topic = "c.Run") public class Run {
private static ReentrantLock reentrantLock = new ReentrantLock();
public static void main(String[] args) { Chopstick c1 = new Chopstick("1"); Chopstick c2 = new Chopstick("2"); Chopstick c3 = new Chopstick("3"); Chopstick c4 = new Chopstick("4"); Chopstick c5 = new Chopstick("5"); new Philosopher("苏格拉底", c1, c2).start(); new Philosopher("柏拉图", c2, c3).start(); new Philosopher("亚里士多德", c3, c4).start(); new Philosopher("赫拉克利特", c4, c5).start(); new Philosopher("阿基米德", c5, c1).start(); } }
class Philosopher extends Thread { Chopstick left; Chopstick right; String name;
public Philosopher(String name, Chopstick c1, Chopstick c2) { left = c1; right = c2; this.name = name; }
public void run() { while (true) { if (left.tryLock()) { try { if (right.tryLock()) { try { System.out.println(name + " eating..."); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { right.unlock(); } } } finally { left.unlock(); } } } } }
class Chopstick extends ReentrantLock { String name;
public Chopstick(String name) { this.name = name; }
@Override public String toString() { return "筷子{" + name + '}'; } }
|