- //加synchronize进行同步
- //释放资源又很快获得自身的资源,这样不妥,吃完的话休息100ms
- //每个人先申请编号小的筷子
- public class Philosopher implements Runnable {
- int[] fork = new int[5];
- Thread thread1 = new Thread(this, "1");
- Thread thread2 = new Thread(this, "2");
- Thread thread3 = new Thread(this, "3");
- Thread thread4 = new Thread(this, "4");
- Thread thread5 = new Thread(this, "5");
- public void run() {
- try {
- while (true) {
- if (Thread.currentThread().getName().equals("1")) {
- while (fork[0] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[0] = 1;
- while (fork[1] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[1] = 1;
- System.out.println("1 eats for 3 seconds");
- Thread.sleep(3000);
- fork[0] = 0;
- fork[1] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("2")) {
- while (fork[1] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[1] = 1;
- while (fork[2] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[2] = 1;
- System.out.println("2 eats for 3 seconds");
- Thread.sleep(3000);
- fork[1] = 0;
- fork[2] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("3")) {
- while (fork[2] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[2] = 1;
- while (fork[3] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[3] = 1;
- System.out.println("3 eats for 3 seconds");
- Thread.sleep(3000);
- fork[2] = 0;
- fork[3] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("4")) {
- while (fork[3] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[3] = 1;
- while (fork[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[4] = 1;
- System.out.println("4 eats for 3 seconds");
- Thread.sleep(3000);
- fork[3] = 0;
- fork[4] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("5")) {
- while (fork[0] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[0] = 1;
- while (fork[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[4] = 1;
- System.out.println("5 eats for 3 seconds");
- Thread.sleep(3000);
- fork[0] = 0;
- fork[4] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- }
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- Philosopher phi = new Philosopher();
- for (int i = 0; i < 5; i++) phi.fork[i] = 0;
- phi.thread1.start();
- phi.thread2.start();
- phi.thread3.start();
- phi.thread4.start();
- phi.thread5.start();
- }
- }
- //当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
- //让刚吃完的一个人阻塞,5根筷子供4个人选,则必有一个人获得在其左右的两双筷子
- public class Philosopher1 implements Runnable {
- int[] ifeat = new int[5];
- int[] fork = new int[5];
- int noteat;
- Thread thread1 = new Thread(this, "1");
- Thread thread2 = new Thread(this, "2");
- Thread thread3 = new Thread(this, "3");
- Thread thread4 = new Thread(this, "4");
- Thread thread5 = new Thread(this, "5");
- public void run() {
- try {
- while (true) {
- if (Thread.currentThread().getName().equals("1")) {
- while (ifeat[0] == 1) {
- synchronized(this) {
- wait();
- }
- }
- while (fork[0] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[0] = 1;
- while (fork[1] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[1] = 1;
- System.out.println("1 eats for 3 seconds");
- Thread.sleep(3000);
- fork[0] = 0;
- fork[1] = 0;
- ifeat[noteat] = 0;
- noteat = 0;
- ifeat[0] = 1;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("2")) {
- while (ifeat[1] == 1) {
- synchronized(this) {
- wait();
- }
- }
- while (fork[1] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[1] = 1;
- while (fork[2] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[2] = 1;
- System.out.println("2 eats for 3 seconds");
- Thread.sleep(3000);
- fork[1] = 0;
- fork[2] = 0;
- ifeat[noteat] = 0;
- noteat = 1;
- ifeat[1] = 1;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("3")) {
- while (ifeat[2] == 1) {
- synchronized(this) {
- wait();
- }
- }
- while (fork[2] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[2] = 1;
- while (fork[3] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[3] = 1;
- System.out.println("3 eats for 3 seconds");
- Thread.sleep(3000);
- fork[2] = 0;
- fork[3] = 0;
- ifeat[noteat] = 0;
- noteat = 2;
- ifeat[2] = 1;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("4")) {
- while (ifeat[3] == 1) {
- synchronized(this) {
- wait();
- }
- }
- while (fork[3] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[3] = 1;
- while (fork[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[4] = 1;
- System.out.println("4 eats for 3 seconds");
- Thread.sleep(3000);
- fork[3] = 0;
- fork[4] = 0;
- ifeat[noteat] = 0;
- noteat = 3;
- ifeat[3] = 1;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("5")) {
- while (ifeat[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- while (fork[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[4] = 1;
- while (fork[0] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[0] = 1;
- System.out.println("5 eats for 3 seconds");
- Thread.sleep(3000);
- fork[4] = 0;
- fork[0] = 0;
- ifeat[noteat] = 0;
- noteat = 4;
- ifeat[4] = 1;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- }
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- Philosopher1 phi = new Philosopher1();
- for (int i = 0; i < 5; i++) phi.fork[i] = 0;
- phi.ifeat[0] = 1;
- for (int i = 0; i < 5; i++) phi.ifeat[i] = 0;
- phi.noteat = 0;
- phi.thread1.start();
- phi.thread2.start();
- phi.thread3.start();
- phi.thread4.start();
- phi.thread5.start();
- }
- }
- //只有两双筷子都有,才获取,且同时获取两双筷子
- public class Philosopher2 implements Runnable {
- int[] fork = new int[5];
- Thread thread1 = new Thread(this, "1");
- Thread thread2 = new Thread(this, "2");
- Thread thread3 = new Thread(this, "3");
- Thread thread4 = new Thread(this, "4");
- Thread thread5 = new Thread(this, "5");
- public void run() {
- try {
- while (true) {
- if (Thread.currentThread().getName().equals("1")) {
- while (fork[0] == 1 || fork[1] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[0] = 1;
- fork[1] = 1;
- System.out.println("1 eats for 3 seconds");
- Thread.sleep(3000);
- fork[0] = 0;
- fork[1] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("2")) {
- while (fork[1] == 1 || fork[2] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[1] = 1;
- fork[2] = 1;
- System.out.println("2 eats for 3 seconds");
- Thread.sleep(3000);
- fork[1] = 0;
- fork[2] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("3")) {
- while (fork[2] == 1 || fork[3] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[2] = 1;
- fork[3] = 1;
- System.out.println("3 eats for 3 seconds");
- Thread.sleep(3000);
- fork[2] = 0;
- fork[3] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("4")) {
- while (fork[3] == 1 || fork[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[3] = 1;
- fork[4] = 1;
- System.out.println("4 eats for 3 seconds");
- Thread.sleep(3000);
- fork[3] = 0;
- fork[4] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- } else if (Thread.currentThread().getName().equals("5")) {
- while (fork[0] == 1 || fork[4] == 1) {
- synchronized(this) {
- wait();
- }
- }
- fork[0] = 1;
- fork[4] = 1;
- System.out.println("5 eats for 3 seconds");
- Thread.sleep(3000);
- fork[0] = 0;
- fork[4] = 0;
- synchronized(this) {
- notifyAll();
- }
- Thread.sleep(100);
- }
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- Philosopher2 phi = new Philosopher2();
- for (int i = 0; i < 5; i++) phi.fork[i] = 0;
- phi.thread1.start();
- phi.thread2.start();
- phi.thread3.start();
- phi.thread4.start();
- phi.thread5.start();
- }
- }
来源: http://www.bubuko.com/infodetail-2446684.html