• Java多线程之notifyAll的作用域


    notifyAll()因某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒。

    package Thread.Wait;
    
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    class Blocker {
        synchronized void waitingCall() {
            try {
                while (!Thread.interrupted()) {
                    wait();
                    System.out.println(Thread.currentThread() + " ");
                }
            } catch (Exception e) {
                // OK to exit this way
            }
        }
    
        synchronized void prod() {
            notify();
        }
    
        synchronized void proAll() {
            notifyAll();
        }
    }
    
    class Task implements Runnable {
        static Blocker blocker = new Blocker();
    
        public void run() {
            blocker.waitingCall();
        }
    }
    
    class Task2 implements Runnable {
        static Blocker blocker = new Blocker();
    
        public void run() {
            blocker.waitingCall();
        }
    }
    
    public class NotifyVsNotifyAll {
        public static void main(String[] args) throws Exception {
            ExecutorService exec = Executors.newCachedThreadPool();
            for (int i = 0; i < 5; i++) {
                exec.execute(new Task());
            }
            exec.execute(new Task2());
            Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                boolean prod = true;
    
                @Override
                public void run() {
                    if (prod) {
                        System.out.println("
    notify() ");
                        Task.blocker.prod();
                        prod = false;
                    } else {
                        System.out.println("
    notifyAll()");
                        Task.blocker.proAll();
                        prod = true;
                    }
                }
            }, 400, 400);
        }
    }
  • 相关阅读:
    linux安装kibana
    linux安装6.5.3版本elastic search
    linux非root用户安装nginx
    linux非root用户安装ncurses-devel依赖
    linux无网络情况下安装rpm包
    linux非root用户安装rabbitmq
    linux非root用户安装4.0.14版本redis
    (初)Knockout 监控属性(Observables)
    ECMAScript6
    SonarLint 代码质量管理
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3758168.html
Copyright © 2020-2023  润新知