让class Chopsticks extends ReentrantLock用trylock试图获取锁,如果无法获取则最后释放锁(可以让别人拿到锁)。
public class Test_Pheat { public static void main(String[] args) { Chopsticks c1=new Chopsticks("c1"); Chopsticks c2=new Chopsticks("c2"); Chopsticks c3=new Chopsticks("c3"); Chopsticks c4=new Chopsticks("c4"); Chopsticks c5=new Chopsticks("c5"); new Thread(new Philosopher("1号",c1,c2)).start(); new Thread(new Philosopher("2号",c2,c3)).start(); new Thread(new Philosopher("3号",c3,c4)).start(); new Thread(new Philosopher("4号",c4,c5)).start(); new Thread(new Philosopher("5号",c1,c5)).start(); } } class Philosopher implements Runnable{ String philosophername; Chopsticks left; Chopsticks right; public Philosopher(String philosophername,Chopsticks left, Chopsticks right) { this.left = left; this.right = right; this.philosophername = philosophername; } @Override public void run() { while (true){ try { if (left.tryLock(1, TimeUnit.SECONDS)){ try { // System.out.println(this.philosophername+"拿到左手筷子"); if (right.tryLock()){ try { eat(); }finally { right.unlock(); } } }finally { left.unlock(); } } } catch (InterruptedException e) { e.printStackTrace(); } } } private void eat() { System.out.println(philosophername+"拿了两支筷子,可以吃了"); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } class Chopsticks extends ReentrantLock { String chopstickname; public Chopsticks(String name) { this.chopstickname = name; } @Override public String toString() { return "chopsticks{" + "name='" + chopstickname + '\'' + '}'; } }