java - 我们可以有一个弱线程吗?

时间:2016-08-23 09:22:03

标签: java multithreading weak-references

我们可以对正在运行的线程的弱引用以低性能CPU终止吗?

我的意思是,这样做有用吗?

WeakReference<Thread> ref = new WeakReference<Thread>(new Thread(){
    public void run(){
        while(true){ /* your code */ }
    }
});

这样,我希望一个线程具有低优先级来执行,我的意思是当CPU性能低并且CPU完全使用时,线程的执行会自动终止。

有些线程不具有高优先级,应该以低CPU性能中断和终止。

3 个答案:

答案 0 :(得分:3)

这是通过您描述的方式中的弱引用无法实现的。本文很好地定义了弱引用,因此您可能对此感兴趣:weak reference

您需要解决两个问题,简单且不那么容易。 我认为标准Java API中没有任何内容可用于此。

轻松一个 - 终止&#34;低&#34;优先级线程:

实现所需行为的简单方法是根据您的应用程序规则将Runnable低优先级实例注册到某种状态管理器。这些实例将实现某种stop()和optionaly pause()resume()行为,并将其公开给状态管理器,该状态管理器可以停止某种信号上的所有实例。你可以简单地在run()循环中检查一些volatile布尔值。

不那么容易 - 确定CPU使用率

使用JNI或某种第三方库,例如以下其中一种:  How to monitor the computer's cpu, memory, and disk usage in Java?

您可以通过步骤2定期检查资源消耗情况,如果您确定通知状态管理器关闭低优先级任务,则可能会出现问题。

答案 1 :(得分:2)

简短回答:。抱歉!

标准API中没有这样的机制,你不能使用WeakReference构建这样的东西,因为引用只涉及对象的可达性,而不涉及CPU活动。

但这并不是说这个比喻并不整洁,并不是说这是个坏主意!我更喜欢它。

你有一个希望是分配一个低线程优先级 - 但正如其他地方所指出的那样,这些都是微妙的,很快就会发怒。低优先级线程应该让位于更高优先级的线程,并且适用于while循环线程。危险在于不同的OS调度系统可能会导致您的低优先级线程饿死,特别是如果您不太注意确保优先级较高的线程偶尔阻塞。您可能会发现多处理器与单处理器之间存在极大的变量行为。

鉴于您希望任务实际终止于CPU负载......您可以使用System.nanoTime()来定时执行循环的每次传递,如果它超过某个阈值,则退出while循环。我不喜欢这么多:它容易受到GC暂停和自然变化的影响而导致行动中止。

或者,您可以使用JMX来测量实际CPU负载,请参阅How to get percentage of CPU usage of OS from java - 如果超过阈值,则中止while循环。您可以拥有一个监视线程,在您的worker上引发Thread.interrupt()以中止任何阻塞活动。我可以想象你会花一辈子的时间来调整它 - 在某些情况下太急切,在其他情况下太乏力了;在不同大小的主机上变化很大。

如果你想在实际运行时杀死线程......那真的很难开始。我开始认为可能还有其他方法,但如果不了解更多关于你要解决的更广泛问题的话,很难说。

虽然还很整洁。

答案 2 :(得分:1)

您需要使用thread priority来实现目标。

weak reference的想法是允许更早的垃圾收集。但是在线程的情况下,使用它是没有意义的,因为线程本身是gc root并且不会在RUNNING状态中被垃圾收集。