亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當線程改變狀態時,有沒有辦法在進程中獲取通知?

當線程改變狀態時,有沒有辦法在進程中獲取通知?

函數式編程 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 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號