本文共 4776 字,大约阅读时间需要 15 分钟。
public class PrintNumber { /** * 打印锁,同一时刻仅有一个任务可以持有此锁 */ private static Object lock = new Object(); /** * 计数器 */ private static int counter = 1; /** * 计数器最大值 */ private static final int MAX_COUNTER = 100; public static void main(String args[]) { // 奇数打印线程 Thread oddThread = new Thread() { @Override public void run() { // 请求打印锁 synchronized (lock) { while (counter <= MAX_COUNTER) { // counter为奇数,打印counter并唤醒偶数打印线程 if (counter % 2 != 0) { System.out.println("Thread1 : " + counter); counter = counter + 1; lock.notifyAll(); } // counter为偶数,挂起并等待偶数打印线程唤醒 else { try { lock.wait(); } catch (Exception e) { e.printStackTrace(); } } } } } }; // 偶数打印线程 Thread evenThread = new Thread() { @Override public void run() { // 请求打印锁 synchronized (lock) { while (counter <= MAX_COUNTER) { // counter为偶数,打印counter并唤醒奇数打印线程 if (counter % 2 == 0) { System.out.println("Thread2 : " + counter); counter = counter + 1; lock.notifyAll(); } // counter为奇数,挂起并等待奇数打印线程唤醒 else { try { lock.wait(); } catch (Exception e) { e.printStackTrace(); } } } } } }; oddThread.start(); evenThread.start(); }}
public class PrintNumber { /** * 打印锁,同一时刻仅有一个任务可以持有此锁 */ private static Lock lock = new ReentrantLock(); private static Condition oddCondition = lock.newCondition(); private static Condition evenCondition = lock.newCondition(); /** * 计数器 */ private static int counter = 1; /** * 计数器最大值 */ private static final int MAX_COUNTER = 100; public static void main(String args[]) { // 奇数打印线程 Thread oddThread = new Thread() { @Override public void run() { try { // 请求打印锁 lock.lock(); while (counter <= MAX_COUNTER) { // counter为奇数,打印counter并唤醒偶数打印线程 if (counter % 2 != 0) { System.out.println("Thread1 : " + counter); counter = counter + 1; evenCondition.signalAll(); } // counter为偶数,挂起并等待偶数打印线程唤醒 else { try { oddCondition.await(); } catch (Exception e) { e.printStackTrace(); } } } } finally { // 释放打印锁 lock.unlock(); } } }; // 偶数打印线程 Thread evenThread = new Thread() { @Override public void run() { try { // 请求打印锁 lock.lock(); while (counter <= MAX_COUNTER) { // counter为偶数,打印counter并唤醒奇数打印线程 if (counter % 2 == 0) { System.out.println("Thread2 : " + counter); counter = counter + 1; oddCondition.signalAll(); } // counter为奇数,挂起并等待奇数打印线程唤醒 else { try { evenCondition.await(); } catch (Exception e) { e.printStackTrace(); } } } } finally { // 释放打印锁 lock.unlock(); } } }; oddThread.start(); evenThread.start(); }}
转载地址:http://fnaii.baihongyu.com/