使用Reentrantlock实现
package com.wang; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Solution { public static int n=0; public static void main(String[] args) { ReentrantLock lock=new ReentrantLock(); Condition conditionodd=lock.newCondition(); Condition conditioneven=lock.newCondition(); Thread threadeven = new Thread(()->{ lock.lock(); try{ while(n<100){ System.out.println(n++); conditioneven.signalAll(); conditionodd.await(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }); Thread thread=new Thread(()->{ lock.lock(); try{ while(n<100){ System.out.println(n++); conditionodd.signalAll(); conditioneven.await(); } }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } }); thread.start(); threadeven.start(); } }
使用synchronized实现
public class test { public static int n = 0; public static Object object = new Object(); public static boolean even = true; public static void main(String[] args) { Thread threadeven = new Thread(() -> { synchronized (object) { while (n < 100) { if (even) { System.out.println(n++); even = false; object.notify(); } try { object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }); Thread threadodd = new Thread(() -> { synchronized (object) { while (n < 100) { if (!even) { System.out.println(n++); even = true; object.notify(); } try { object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }); threadeven.start(); threadodd.start(); } }
注意:wait() await() 这些方法必须在同步代码块使用