gpt4 book ai didi

java - 每个线程应该运行特定的持续时间

转载 作者:行者123 更新时间:2023-11-30 11:35:34 29 4
gpt4 key购买 nike

我正在从事一个项目,在该项目中,我将从多线程代码生成多个线程。

假设我生成 10 个线程,那么我需要确保每个线程都应该运行特定的持续时间。

例如,如果我希望每个线程 应该运行30 分钟,那么在config.properties 文件中,我将拥有TOTAL_RUNNING_TIME=30

所以我提出了以下设计,以确保每个线程都运行 30 分钟

private static long durationOfRun;
private static long sleepTime;

public static void main(String[] args) {

// create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(threads);

try {

readPropertyFile();

for (int i = 0; i < threads; i++) {
service.submit(new ReadTask(durationOfRun, sleepTime));
}
}
}

private static void readPropertyFile() throws IOException {
prop.load(Read.class.getClassLoader().getResourceAsStream("config.properties"));

threads = Integer.parseInt(prop.getProperty("NUMBER_OF_THREADS"));
durationOfRun = Long.parseLong(prop.getProperty("TOTAL_RUNNING_TIME"));
sleepTime = Long.parseLong(prop.getProperty("SLEEP_TIME"));
}

下面是我的 ReadTask 类。

class ReadTask implements Runnable {
private long durationOfRun;
private long sleepTime;

public ReadTask(long durationOfRun, long sleepTime) {
this.durationOfRun = durationOfRun;
this.sleepTime = sleepTime;
}

@Override
public void run() {

long startTime = System.currentTimeMillis();
long endTime = startTime + (durationOfRun*60*1000);

//Each thread is running less than endTime
while(System.currentTimeMillis() <= endTime) {

//Do whatever you want to do

}

Thread.sleep(sleepTime);
}
}

如果您看一下我的 run 方法,我有一个 while 循环来检查时间。那么这种让每个线程运行特定时间的方法是否正确?或者还有更好的方法吗?如果还有其他更好的方法,请忽略我的无知,或者这也可以达到目的?

让我知道这里是否也存在任何线程安全问题?

我正在寻找的是每个线程应该运行 30 分钟,如果该线程的时间已结束,则完成当前正在运行的任务,之后不要执行任何其他操作,就像我们有 ExecutorServiceshutdown 如果有比这更好的方法或更好的设计。请给我一些例子,这样我就可以从我的知识角度来学习那些东西。感谢您的帮助。

更新:-

如果您在 run 方法中查看我的 while 循环,我将在该 while 循环中尝试对数据库进行 Select 调用。所以我正在寻找的是这样的——一旦该线程的时间结束,它就不会对数据库进行任何其他选择调用,也不会完成它之前所做的任何事情。就像 shutdown 适用于 ExecutorService 一样。

而且我不希望出现这种情况 - 一旦该线程的时间结束,它就会使线程超时,因为它可能会超时,该特定线程在那段时间正在对数据库进行选择?

最佳答案

我对这种设计的担忧之一是,如果在 while 循环中完成的工作量比我们花费的时间更多怎么办?

例如

while(System.currentTimeMillis() <= endTime) {

calaculateTheMeaningOfLife();

}

现在发生了什么?是什么停止线程,或鼓励它检查超时?如果您有阻塞操作,例如文件或套接字读/写,也会发生同样的事情

您可以尝试中断线程,但不能保证这会有帮助

关于java - 每个线程应该运行特定的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046294/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com