多线程打印奇偶数

    技术2026-03-26  17

    错误示范:

    package 多线程; /** * 奇偶线程交替打印1-100的奇偶数 * */ public class PrintOddAndEven implements Runnable { private String name; private Object lock;//信号量实现同步 private static volatile int counts = 1; public PrintOddAndEven(String name,Object lock){ this.name = name; this.lock = lock; } @Override public void run() { while(counts<=100){//没打印完的话,获取lock进行打印 synchronized (lock){ System.out.println(name+":"+(counts++)); lock.notify(); try { lock.wait();//不能仅这样写,这样写会导致由于最后一个线程被阻塞没法再被唤醒了从而令程序结束不了 } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws InterruptedException { Object lock = new Object(); PrintOddAndEven odd = new PrintOddAndEven("odd",lock); PrintOddAndEven even = new PrintOddAndEven("even",lock); new Thread(odd).start(); Thread.sleep(1000); new Thread(even).start(); Thread.sleep(1000); } } package ThreadTest.ABC; public class ThreadPrintOddAndEven implements Runnable{ private String name; private static volatile int count = 0; private Object lock;//充当信号量,实现线程间的同步 private ThreadPrintOddAndEven(String name,Object lock){ this.name = name; this.lock = lock; } @Override public void run() { synchronized (lock){ while(count<=100){ System.out.println(name+":"+(count++)); lock.notifyAll();//先唤醒被lock阻塞的另一个打印线程 if(count<=101){//这里有两种处理方案保证不会因为最后一个线程被阻塞而导致程序结束不了。case1:当已经打印完所有数后,执行notifyAll(),防止另一个线程因为没有获得lock的锁而被阻塞导致无法被唤醒,导致程序结束不了 try { lock.wait();//阻塞当前线程 } catch (InterruptedException e) { e.printStackTrace(); } } } } } public static void main(String[] args) throws InterruptedException { Object lock = new Object(); ThreadPrintOddAndEven pEven = new ThreadPrintOddAndEven("偶数:",lock); ThreadPrintOddAndEven pOdd = new ThreadPrintOddAndEven("奇数:",lock); new Thread(pEven).start(); Thread.sleep(100); new Thread(pOdd).start(); Thread.sleep(100); } }

    cae2:

    package 多线程; /** * 奇偶线程交替打印1-100的奇偶数 * */ public class PrintOddAndEven implements Runnable { private String name; private Object lock;//信号量实现同步 private static volatile int counts = 1; public PrintOddAndEven(String name,Object lock){ this.name = name; this.lock = lock; } @Override public void run() { while(counts<=100){//没打印完的话,获取lock进行打印 synchronized (lock){ System.out.println(name+":"+(counts++)); lock.notify(); if(counts<100){//这里有两种处理方案保证不会因为最后一个线程被阻塞而导致程序结束不了。case2:只有还有剩余的数没打印时才去阻塞当前线程 try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public static void main(String[] args) throws InterruptedException { Object lock = new Object(); PrintOddAndEven odd = new PrintOddAndEven("odd",lock); PrintOddAndEven even = new PrintOddAndEven("even",lock); new Thread(odd).start(); Thread.sleep(1000); new Thread(even).start(); } }
    Processed: 0.010, SQL: 9