多线程交替打印奇偶数 发表于 2021-02-26 | 分类于 多线程 | | 阅读量 字数统计: 340 字 | 阅读时长 ≈ 1 分钟 题目实现两个线程分别打印奇数和偶数,中间停顿1秒。 案例: 12345678输出:偶数:0奇数:1偶数:2奇数:3偶数:4奇数:5偶数:6 解法1123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051import java.util.concurrent.Semaphore;// 使用Semaphore实现public class PrintOddEven1 { private static volatile int num = 0; private static Semaphore semaphore = new Semaphore(1); public static void main(String[] args) { new Odd().start(); new Even().start(); } static class Odd extends Thread { @Override public void run() { while (true) { if (num % 2 != 0) { try { semaphore.acquire(); Thread.sleep(1000); System.out.println("奇数:" + num++); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } } } } static class Even extends Thread { @Override public void run() { while (true) { if (num % 2 == 0) { try { semaphore.acquire(); Thread.sleep(1000); System.out.println("偶数:" + num++); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } } } } }} 解法212345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152//使用锁对象实现public class PrintOddEven2 { private static Object lock = new Object(); private static int num = 0; public static void main(String[] args) { new OddThread().start(); new EvenThread().start(); } static class OddThread extends Thread { @Override public void run() { while (true) { synchronized (lock) { if (num % 2 == 1) { System.out.println("奇数线程:" + num++); } else { try { Thread.sleep(1000); lock.notify(); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } static class EvenThread extends Thread { @Override public void run() { while (true) { synchronized (lock) { if (num % 2 == 0) { System.out.println("偶数线程:" + num++); } else { try { Thread.sleep(1000); lock.notify(); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }}