JUC 线程通信
一、过程
1、创建资源类,在资源类创建属性和方法
2、在资源类中操作方法
a、判断
b、干活
c、通知
3、创建多个线程,调用资源类的操作方法
4、防止虚假唤醒
二、同步
package com.wt.sync; /** * @Description: TODO * @Author: 1872428 * @Date: 2025/5/30 16:01 * @Version: 1.0 **/ class Share{ private int num = 0; // +1 public synchronized void incr(){ // 判断 while (num == 1){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 干活 num++; System.out.println(Thread.currentThread().getName()+">>"+num); // 通知 notifyAll(); } // -1 public synchronized void decr(){ // 判断 while (num == 0){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 干活 num--; System.out.println(Thread.currentThread().getName()+"<<"+num); // 通知 notifyAll(); } } public class ThreadDemon { public static void main(String[] args) { Share share = new Share(); new Thread(()->{ for (int i = 0; i < 20; i++) { share.incr(); } },"AA").start(); new Thread(()->{ for (int i = 0; i < 20; i++) { share.decr(); } }, "BB").start(); new Thread(()->{ for (int i = 0; i < 20; i++) { share.incr(); } },"CC").start(); new Thread(()->{ for (int i = 0; i < 20; i++) { share.decr(); } }, "DD").start(); } }
三、Lock
package com.wt.lock; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Description: TODO * @Author: 1872428 * @Date: 2025/5/30 17:07 * @Version: 1.0 * 1、创建类,属性和方法 * 2、方法三步走 * 3、创建多线程 * 4、防止虚假唤醒 **/ class Share{ // private int num = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void incr(){ lock.lock(); try { // 判断 while (num == 1){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } // 干活 num++; System.out.println(Thread.currentThread().getName()+">>" + num); // 通知 condition.signalAll(); } finally { lock.unlock(); } } public void decr(){ lock.lock(); try { // 判断 while (num == 0){ try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } // 干活 num--; System.out.println(Thread.currentThread().getName()+"<<" + num); // 通知 condition.signalAll(); } finally { lock.unlock(); } } } public class ThreadDemon { public static void main(String[] args) { Share share = new Share(); new Thread(()->{ for (int i = 0; i < 10; i++) { share.incr(); } },"AA").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { share.decr(); } },"BB").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { share.incr(); } },"CC").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { share.decr(); } },"DD").start(); } }

浙公网安备 33010602011771号