如大家所熟悉的程序员在学操作系统的时候一般都会接触一个经典问题——哲学家进餐问题有 5 个哲学家围着在一个圆桌上而圆桌上正好放有 5 根筷子每根筷子放在两个哲学家之间就在这两个人的左 / 右手边并且这两个哲学家都能拿起筷子哲学家进餐有规定每个人只能拿起左手边和右手边的筷子如果没有两根筷子就不能进餐每个人进餐结束之后将筷子放回原处。这个问题很考验程序员对线程同步的理解感兴趣的读者可以自己先尝试编程实现。以下是解题参考程序import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class DiningPhilosophers { public static void main(String[] args) { Lock[] forks new ReentrantLock[5]; for (int i 0; i 5; i) { forks[i] new ReentrantLock(); } Philosopher[] philosophers new Philosopher[5]; for (int i 0; i 5; i) { philosophers[i] new Philosopher(i, forks[i], forks[(i 1) % 5]); } for (Philosopher philosopher : philosophers) { philosopher.start(); } } static class Philosopher extends Thread { private int id; private Lock leftFork; private Lock rightFork; public Philosopher(int id, Lock leftFork, Lock rightFork) { this.id id; this.leftFork leftFork; this.rightFork rightFork; } public void run() { while (true) { think(); pickUpLeftFork(); pickUpRightFork(); eat(); putDownRightFork(); putDownLeftFork(); } } private void think() { System.out.println(Philosopher id is thinking); try { Thread.sleep((long) (Math.random() * 5000)); } catch (InterruptedException e) { e.printStackTrace(); } } private void eat() { System.out.println(Philosopher id is eating); try { Thread.sleep((long) (Math.random() * 5000)); } catch (InterruptedException e) { e.printStackTrace(); } } private void pickUpLeftFork() { leftFork.lock(); System.out.println(Philosopher id picked up left fork); } private void pickUpRightFork() { rightFork.lock(); System.out.println(Philosopher id picked up right fork); } private void putDownLeftFork() { leftFork.unlock(); System.out.println(Philosopher id put down left fork); } private void putDownRightFork() { rightFork.unlock(); System.out.println(Philosopher id put down right fork); } } }总之多线程是有很多知识点需要总结的学习了多线程的概念和方法还应当去实际场景中去应用多敲多练才是掌握知识的最好方法。