我正在做一个项目,我将从多线程代码中生成多个线程。
假设我正在生成 10 个线程,那么我需要确保每个线程都应该运行特定的持续时间。
例如,如果我想each thread
运行 for 30 minutes
,那么在config.properties
文件中,我将拥有TOTAL_RUNNING_TIME=30
所以我想出了下面的设计来确保每个线程都在运行30 minutes
。
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);
}
}
如果你看看我的运行方法,我有一个 while 循环来检查时间。那么这种让每个线程运行特定持续时间的方法是否正确?或者还有什么更好的方法吗?如果还有其他更好的方法,请忽略我的无知,或者这也可以达到目的?
让我知道这里是否还有任何线程安全问题?
我正在寻找的是每个线程应该运行 30 分钟,如果该线程的时间已经结束,那么完成它当前正在运行的任务,之后不要再做任何其他事情,就像我们shutdown
为ExecutorService
. 如果有比这更好的方法或更好的设计。请给我一些例子,以便我可以从我的知识角度学习这些东西。谢谢您的帮助。
更新:-
如果您在 run 方法中查看我的 while 循环,在该 while 循环中,我将尝试创建一个Select call to the database
. 所以我正在寻找的是这样的 - 一旦该线程的时间完成,它就不会对数据库进行任何其他选择调用并完成它之前所做的任何事情。就像shutdown
为ExecutorService
.
而且我不希望出现这种情况 - 一旦该线程的时间结束,它可能会使线程超时,该特定线程在那段时间正在对数据库进行选择?