为了账号安全,请及时绑定邮箱和手机立即绑定

当线程改变状态时,有没有办法在进程中获取通知?

当线程改变状态时,有没有办法在进程中获取通知?

函数式编程 2021-12-30 17:16:49
当线程改变状态时,有没有办法在进程中获取通知?我正在编写一个监视线程状态变化的程序。我可以经常轮询每个线程,但我更喜欢更具反应性的内容。
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

是的,使用conditional variable,这是一个例子:


import java.util.concurrent.locks.*;

public class CubbyHole2 {

    private int contents;

    private boolean available = false;  // this is your state

    private Lock aLock = new ReentrantLock(); // state must be protected by lock

    private Condition condVar = aLock.newCondition(); // instead of polling, block on a condition


    public int get(int who) {

        aLock.lock();  

        try {

            // first check state

            while (available == false) {

                try {

                    // if state not match, go to sleep

                    condVar.await(); 

                } catch (InterruptedException e) { }

            }

            // when status match, do someting


            // change status

            available = false;

            System.out.println("Consumer " + who + " got: " +

                                contents);

            // wake up all sleeper than wait on this condition

            condVar.signalAll();  

        } finally {

            aLock.unlock();

            return contents;

        }

    }


    public void put(int who, int value) {

                    aLock.lock();

    try {

        while (available == true) {

            try {

                condVar.await();

            } catch (InterruptedException e) { }

        }

        contents = value;

        available = true;

        System.out.println("Producer " + who + " put: " +

                            contents);

        condVar.signalAll();

        } finally {

            aLock.unlock();

        }

    }

}


查看完整回答
反对 回复 2021-12-30
?
湖上湖

TA贡献2003条经验 获得超2个赞

您线程运行的代码需要注入代码以进行状态更改的回调。您可以按照@宏杰李的建议通过更改代码或注入代码来完成此操作,Instrumentation但是轮询线程可能是最简单的。

注意:线程的状态仅从 JVM 的角度告诉您它是所需的状态。它没有显示给你

  • 是否被阻塞 IO 操作阻塞?

  • 是否进行了上下文切换

  • 是否被操作系统或 BIOS 中断

  • 是否因 GC 或代码替换而停止

  • 它是否在等待对静态初始化程序块的锁定。例如,如果它阻止等待类初始化,则表示它正在运行。

顺便说一句,即使是操作系统也会轮询 CPU 以查看它们在做什么,通常每秒 100 次。


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信