是否可以控制每个线程在Java中执行的时间量?

时间:2011-10-23 15:11:04

标签: java multithreading callable

我想控制每个线程使用的时间。

一个线程执行某些处理,另一个线程处理数据库中的数据,但由于生成的数据量,插入比处理慢。我想给处理器更多的时间来插入数据。

是否可以通过线程执行此操作?目前,我正在线程中进行处理,但插入时间根据机器而变化。还有其他方法可以做到这一点吗?是否涉及在我的程序中使用线程同步?

3 个答案:

答案 0 :(得分:4)

您可以使用Thread.setPriority(...)来提高线程的优先级,但这并不理想。

也许您可以使用某种形式的blocking queue from the java.util.concurrent package来使一个Thread等待,而另一个Thread正在做某事。例如,SynchronousQueue可用于将消息从一个线程发送到另一个线程,它现在可以执行某些操作。

另一种方法是使用Runnables而不是Threads,并将Runnables提交给Executor,例如ThreadPoolExecutor。该执行程序将扮演确保Runnables使用相当长时间的角色。

答案 1 :(得分:2)

一种方法是将处理线程的优先级设置为低于另一个。但请注意,不建议这样做,因为它不会使您的代码平台保持独立。 (不同的线程优先级在不同的平台上表现不同)。

另一种方法是使用数据线程将继续发送有关其当前状态的消息的服务(可能是一些标志“aboutToOver”)。

或者使用同步说二进制信号量。当数据库线程正在运行时,另一个线程将被阻塞,因此数据库线程将使用所有资源。但是同时处理线程将被阻止。实际上这将是最好的解决方案,因为processign线程可以执行3-4个任务,然后被信号量阻塞,直到以后它可以再次启动并执行任务

答案 2 :(得分:2)

首先要提到的是,线程优先级本身并不意味着“CPU的份额”。关于线程优先级实际意味着什么似乎存在很多混淆,部分原因是它实际上意味着不同操作系统下的不同事物。如果您在Linux中工作,它实际上确实意味着接近CPU的相对份额。但在Windows下,它肯定没有。所以,如果它有任何帮助,你可能首先想看一下我前面编写的关于thread priorities in Java的一些信息,这些信息解释了线程优先级在不同系统上的实际意义。

你的问题的一般答案是,如果你想要一个线程占用CPU的特定份额,最好以编程方式隐式地执行:定期地,对于处理的每个“块”,测量经过的时间(或者如何使用了很多CPU - 它们并不严格地说是相同的事情),然后睡了适当的时间,以便处理/睡眠比率大致达到你想要的处理时间的百分比。

但是,我不确定这实际上会对你的任务有所帮助。

据我了解,基本上你有一个插入任务,这是速率确定步骤。在平均情况下,系统不太可能“故意将更少的CPU专用于运行该插入的线程所需的CPU”。

因此,查看插入任务可能会有更多的里程,并且可以通过编程方式查看插入任务的功能。例如:您可以批量插入吗?如果插入过程由于某种原因(我怀疑)确实是CPU绑定的,你可以多线程吗?为什么你的应用程序实际上关心等待插入完成,你能改变这种依赖吗?

如果插入到标准数据库系统,我想知道该插入是否非常受CPU限制?