JavaFX,Java - 活动线程数更改监听器
Posted
技术标签:
【中文标题】JavaFX,Java - 活动线程数更改监听器【英文标题】:JavaFX, Java - number of active threads change listener 【发布时间】:2021-10-06 09:37:40 【问题描述】:在我的程序中,我有一个状态栏,在那里我使用Thread.activeCount()
指示活动线程的数量,这一切都很好,但目前只有当我单击按钮时才会更新:我再次阅读Thread.activeCount()
然后更新栏上的数字——这不是很有用,因为我必须“手动”请求更新数字。
@FXML
public void btnShowThreads()
btnShowThreads.setText(String.valueOf(Thread.activeCount()));
我需要做的是让一个监听器使用它,但我找不到这样做的方法。我试图避免使用计时器,例如每 0.5 秒运行一次以更新数字 - 因为线程可能在很长一段时间内都是相同的数字。
如何做到这一点?如何收听Thread.activeCount()
的变化?
【问题讨论】:
minimal reproducible example 请.. 你不能,至少不能纯粹使用 Java。每半秒运行一次的计时器(或更好的动画)应该没问题。但也请记住,该方法并不完全可靠,如 its documentation 中所述。 如果您控制所有线程/后台任务的创建和执行,您可以创建一个Executor
来跟踪有多少正在运行并将它们提交给该执行程序。如果您在这种情况下操作,这可能是比不断轮询Thread.activeCount()
更好的解决方案;不过,这与您提出问题的方式略有不同。
【参考方案1】:
正如 cmets 中所述,Java 不提供这样的选项来监听线程更改。作为替代方案,您可以使用Timeline
:
// a Timeline with a KeyFrame that runs for 1 second and updates the value when the cycle finishes
Timeline updater = new Timeline(new KeyFrame(Duration.seconds(1), event ->
activeThreadsLabel.setText("Threads: " + Thread.activeCount());
event.consume();
));
updater.setCycleCount(Animation.INDEFINITE); // run indefinitly
updater.play(); // start
【讨论】:
【参考方案2】:我不确定您是否可以添加某种“侦听器”.. 有可能。但是,如何在专用线程中以设定的时间间隔更新 UI 的某些方面呢?这与添加秒表或其他东西的方法相同。
类似...
// pesudo code
Thread uiUpdated = () ->
while(!Thread.interrupted())
// Update on FX thread - other will cause error
Platform.runLater(() ->
// Update your UI here
myNode.setText("Idk some text here");
);
// Only update the UI every 1s
try
Thread.sleep(1000);
catch (InterruptedException ignored)
;
你可以用 start() 启动它,用 interrupt() 停止它 您甚至可以使用 wait() 和 notify() 暂停和恢复线程https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
【讨论】:
你可以阅读这个this关于时间线和线程的帖子。 是的,我做到了!很有帮助!以上是关于JavaFX,Java - 活动线程数更改监听器的主要内容,如果未能解决你的问题,请参考以下文章
CPU突然飙升到300%,Dubbo活动线程数直接飙到1000
JavaFX UI 在事件侦听器中的 JavaFX 应用程序线程中冻结,但可与 Platform.runLater 一起使用
如何使用更改侦听器 JavaFX 在两个 ListView 之间移动项目
JavaFX TableView:线程“ JavaFX Application Thread”中的异常java.lang.IndexOutOfBoundsException