我想控制每个线程使用的时间量。
一个线程做一些处理,另一个线程处理数据库中的数据,但是由于生成的数据量大,插入比处理慢。我想给更多的处理器时间来插入该数据。
可以用线程做到这一点吗?目前,我正在处理线程中休眠,但插入时间会根据机器而变化。还有其他方法可以做到这一点吗?涉及在我的程序内部使用线程同步的方式吗?
我想控制每个线程使用的时间量。
一个线程做一些处理,另一个线程处理数据库中的数据,但是由于生成的数据量大,插入比处理慢。我想给更多的处理器时间来插入该数据。
可以用线程做到这一点吗?目前,我正在处理线程中休眠,但插入时间会根据机器而变化。还有其他方法可以做到这一点吗?涉及在我的程序内部使用线程同步的方式吗?
您可以使用Thread.setPriority(...)增加线程的优先级,但这并不理想。
也许您可以使用java.util.concurrent 包中的某种形式的阻塞队列来让一个线程等待,而另一个线程正在做某事。例如,可以使用SynchronousQueue将消息从一个线程发送到另一个线程,它现在可以做某事。
另一种方法是使用 Runnables 而不是 Threads,并将 Runnables 提交给 Executor,例如ThreadPoolExecutor。这个 executor 将负责确保 Runnables 使用相当多的时间。
一种方法是将处理线程的优先级设置为低于另一种。但请注意,不建议这样做,因为它不会让您的代码平台保持独立。(不同的线程优先级在不同的平台上表现不同)。
另一种方法是使用服务,其中数据库线程将不断发送有关其当前状态的消息(可能是一些标志“aboutToOver”)。
或者使用同步说二进制信号量。当数据库线程工作时,另一个线程将被阻塞,因此 db 线程将使用所有资源。但同时再次处理线程将被阻塞。实际上这将是最好的解决方案,因为 processign 线程可以执行 3-4 个任务,然后会被信号量阻塞,直到稍后它可以再次起床并执行任务
首先要提到的是线程优先级本身并不意味着“CPU 份额”。关于线程优先级的实际含义似乎存在很多混淆,部分原因是它在不同的操作系统下实际上意味着不同的东西。如果您在 Linux 中工作,它实际上确实意味着接近 CPU 的相对份额。但在 Windows 下,它肯定不会。因此,如果它有任何帮助,您可能首先想查看我不久前编译的一些关于Java 中线程优先级的信息,它解释了线程优先级在不同系统上的实际含义。
您的问题的一般答案是,如果您希望线程占用特定的 CPU 份额,最好以编程方式隐式执行此操作:定期,对于每个“块”处理,测量经过的时间(或多少 CPU)使用——严格来说它们不是同一件事),然后睡眠适当的时间,以便处理/睡眠比率大致达到您预期的处理时间的百分比。
但是,我不确定这是否会真正帮助您完成这里的任务。
据我了解,基本上你有一个插入任务,即速率确定步骤。在一般情况下,系统不太可能“故意为运行该插入的线程分配比它可以或需要的更少的 CPU”。
因此,在查看该插入任务并查看是否可以通过编程方式更改该插入任务的功能时,可能会有更多的里程数。例如:您可以批量插入吗?如果插入过程由于某种原因确实受 CPU 限制(我对此表示怀疑),你可以多线程吗?为什么你的应用程序实际上关心等待插入完成,你能改变这种依赖关系吗?
如果插入到标准数据库系统,我想知道该插入是否受到 CPU 的严重限制?