gpt4 book ai didi

java - 每个线程应该运行 10 分钟,如果时间结束则中断线程

转载 作者:行者123 更新时间:2023-12-01 14:49:06 27 4
gpt4 key购买 nike

我正在尝试创建一个 ExecutorService 实现,可以为每个线程提供超时或中断。

在下面的示例中,假设我生成2个线程(在实际场景中,这个数字会很高),那么我需要确保每个线程应该运行10 分钟。这意味着,Thread1 将运行 10 分钟Thread2 也将运行 10 分钟。如果 10 分钟结束,那么我需要中断线程或超时。

下面是我到目前为止的代码,我无法理解应该如何以如此干净的方式在此处添加此中断或超时功能,以便如果我制作此在我的代码中没有线程参数可配置,那么它也应该在那里正常工作。

public static void main(String[] args) {

final int noOfThreads = 2;
final long exp_time_millis = 600000; //10 minutes

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


for (int i = 0, i< noOfThreads; i++) {
service.submit(new ThreadTask());
}
}


class ThreadTask implements Runnable {

@Override
public void run() {

while(true) {
System.out.println("Thread running...");
try {

/* make a select sql to the database
* and measure how much time it is taking in
* returning the response
*/

} catch (InterruptedException e) {

}
}
}
}

任何建议都会有很大帮助。

我已经看过一些关于 SO 的文章,但我找不到任何与我的场景相匹配的内容,并且我可以轻松实现它。

更新的代码:-

我正在尝试下面的代码,但它在 run 方法中的 catch block 上给了我错误。不确定我是否做错了什么。谁能帮我吗?

public class ThreadTimeout {

public static void main(String[] args) {

final int noOfThreads = 2;

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

ScheduledExecutorService scheduleService = Executors.newScheduledThreadPool(noOfThreads);
for (int i = 0; i< noOfThreads; i++) {
final Future future = service.submit(new ThreadTask());
scheduleService.schedule(new Runnable(){
public void run(){
future.cancel(true);
}
}, 10, TimeUnit.MINUTES);
}
}
}

class ThreadTask implements Runnable {

@Override
public void run() {

//make a database connection

while (true) {
System.out.println("Thread running...");
try {
/*
* make a select sql to the database and measure
* how much time it is taking in returning the
* response
*/
} catch (InterruptedException e) {

}
}
}
}

最佳答案

我建议使用第二个ScheduledExecutorService。您可以将从原始提交返回的 Future 提交给 ScheduledExecutorService 来取消。

ScheduledExecutorService scheduleService =   Executors.newScheduledThreadPool(n);
for (int i = 0, i< noOfThreads; i++) {
final Future future = service.submit(new ThreadTask());
scheduleService.schedule(new Runnable(){
public void run(){
future.cancel(true);
}
}, 10, TimeUnits.MINUTES);
}

现在ThreadTask需要响应中断,否则这将无济于事。

关于java - 每个线程应该运行 10 分钟,如果时间结束则中断线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059284/

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