两个线程循环打印奇偶数
题目要求两个线程循环打印奇偶数。1.示例1输入7输出OddThread: 1EvenThread: 2OddThread: 3EvenThread: 4OddThread: 5EvenThread: 6OddThread: 72.示例2输入5输出OddThread: 1EvenThread: 2OddThread: 3EvenThread: 4OddThread: 5附代码一、方法一ReentrantLock Conditionclass PrintOddEven { // 成员变量字段用于存储对象状态在整个类中都可以使用 // 表示当前要打印的数字是从1开始打印 private int num 1; // 表示结尾数字 private final int max; // 可重入锁 private final ReentrantLock lock new ReentrantLock(); // 创建一个与该锁绑定的等待队列oddCondition用于管理线程的等待和唤醒 private final Condition oddCondition lock.newCondition(); // 奇数线程的等待队列 private final Condition evenCondition lock.newCondition(); // 偶数线程的等待队列 public PrintOddEven(int max) { // 构造方法参数用于从外部接收传入的值 this.max max; // 把参数的值赋给成员变量 } // 奇数线程 public void printOdd() { while (num max) { // 循环没超过最大值的时候才打印 lock.lock(); // 获取锁 try { if (num % 2 ! 0) { // 如果是奇数 // 打印该奇数 System.out.println(Thread.currentThread().getName() : num); num; // 唤醒偶数线程 evenCondition.signal(); } // 如果是偶数 else { // 奇数线程等待 oddCondition.await(); } // 捕获await()线程在等待期间其他线程调用interrupt()抛出的InterruptedException异常 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } public void printEven() { while (num max) { lock.lock(); try { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; oddCondition.signal(); } else { evenCondition.await(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } }二、方法二Synchronized wait/notifyclass PrintOddEven { private int num 1; private final int max; private final Object lock new Object(); public PrintOddEven(int max) { this.max max; } public void printOdd() { synchronized (lock) { while (num max) { if (num % 2 ! 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } public void printEven() { synchronized (lock) { while (num max) { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } }三、方法三使用信号量 Semaphore最简洁class PrintOddEven { private int num 1; private final int max; private final Semaphore oddSemaphore new Semaphore(1); private final Semaphore evenSemaphore new Semaphore(0); public PrintOddEven(int max) { this.max max; } public void printOdd() { while (num max) { try { oddSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } evenSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } public void printEven() { while (num max) { try { evenSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } oddSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }ACM模式一、方法一ReentrantLock Conditionimport java.util.Scanner; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class PrintOddEven { // 成员变量字段用于存储对象状态在整个类中都可以使用 // 表示当前要打印的数字是从1开始打印 private int num 1; // 表示结尾数字 private final int max; // 可重入锁 private final ReentrantLock lock new ReentrantLock(); // 创建一个与该锁绑定的等待队列oddCondition用于管理线程的等待和唤醒 private final Condition oddCondition lock.newCondition(); // 奇数线程的等待队列 private final Condition evenCondition lock.newCondition(); // 偶数线程的等待队列 public PrintOddEven(int max) { // 构造方法参数用于从外部接收传入的值 this.max max; // 把参数的值赋给成员变量 } // 奇数线程 public void printOdd() { while (num max) { // 循环没超过最大值的时候才打印 lock.lock(); // 获取锁 try { if (num % 2 ! 0) { // 如果是奇数 // 打印该奇数 System.out.println(Thread.currentThread().getName() : num); num; // 唤醒偶数线程 evenCondition.signal(); } // 如果是偶数 else { // 奇数线程等待 oddCondition.await(); } // 捕获await()线程在等待期间其他线程调用interrupt()抛出的InterruptedException异常 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } public void printEven() { while (num max) { lock.lock(); try { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; oddCondition.signal(); } else { evenCondition.await(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 传入参数n用于后续构造方法接收参数max并把参数的值赋值给成员变量this.max(private final int max) PrintOddEven printOddEven new PrintOddEven(n); // 里存放的是线程名称会被子函数的Thread.currentThread().getName()获取到 Thread oddThread new Thread(() - printOddEven.printOdd(), OddThread); Thread evenThread new Thread(() - printOddEven.printEven(), EvenThread); oddThread.start(); evenThread.start(); oddThread.join(); evenThread.join(); scanner.close(); } }二、方法二Synchronized wait/notifyimport java.util.Scanner; class PrintOddEven { private int num 1; private final int max; private final Object lock new Object(); public PrintOddEven(int max) { this.max max; } public void printOdd() { synchronized (lock) { while (num max) { if (num % 2 ! 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } public void printEven() { synchronized (lock) { while (num max) { if (num % 2 0) { System.out.println(Thread.currentThread().getName() : num); num; lock.notify(); } else { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); // 读取最大值 int n scanner.nextInt(); PrintOddEven printOddEven new PrintOddEven(n); // 创建两个线程 Thread oddThread new Thread(() - printOddEven.printOdd(), OddThread); Thread evenThread new Thread(() - printOddEven.printEven(), EvenThread); // 启动线程 oddThread.start(); evenThread.start(); // 等待线程结束 oddThread.join(); evenThread.join(); scanner.close(); } }三、方法三使用信号量 Semaphore最简洁import java.util.Scanner; import java.util.concurrent.Semaphore; class PrintOddEven { private int num 1; private final int max; private final Semaphore oddSemaphore new Semaphore(1); private final Semaphore evenSemaphore new Semaphore(0); public PrintOddEven(int max) { this.max max; } public void printOdd() { while (num max) { try { oddSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } evenSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } public void printEven() { while (num max) { try { evenSemaphore.acquire(); if (num max) { System.out.println(Thread.currentThread().getName() : num); num; } oddSemaphore.release(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); PrintOddEven printOddEven new PrintOddEven(n); Thread oddThread new Thread(() - printOddEven.printOdd(), OddThread); Thread evenThread new Thread(() - printOddEven.printEven(), EvenThread); oddThread.start(); evenThread.start(); oddThread.join(); evenThread.join(); scanner.close(); } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2566561.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!