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();

    }
}

 

posted @ 2025-05-30 18:26  市丸银  阅读(10)  评论(0)    收藏  举报