gpt4 book ai didi

java - 这是生成新线程并终止它们的安全方法吗?

转载 作者:行者123 更新时间:2023-11-30 02:51:00 25 4
gpt4 key购买 nike

我有一个应用程序可以接收来自其他应用程序的警报,通常每分钟一次左右,但我需要能够每分钟处理更高的数量。我正在使用的接口(interface)以及一般的警报框架要求警报可以异步处理,并且如果正在异步处理警报则可以停止。 stop 方法具体记录为停止线程。我编写了下面的代码来创建一个 AlertRunner 线程,然后停止该线程。但是,这是处理终止线程的正确方法吗?这段代码是否能够轻松扩展(不会达到荒谬的体积,但可能会发出第二个警报或同时发出多个警报)?

private AlertRunner alertRunner;

@Override
public void receive(Alert a) {
assert a != null;
alertRunner = new alertRunner(a.getName());
a.start();
}

@Override
public void stop(boolean synchronous) {
if(!synchronous) {
if(alertRunner != null) {
Thread.currentThread().interrupt();
}
}
}

class AlertRunner extends Thread {
private final String alertName;

public AlertRunner(String alertName) {
this.alertName = alertName;
}

@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(5);
log.info("New alert received: " + alertName);
} catch (InterruptedException e) {
log.error("Thread interrupted: " + e.getMessage());
}
}
}

最佳答案

这段代码不会轻易扩展,因为Thread是相当“重”的对象。创建成本很高,启动成本也很高。最好使用 ExecutorService 来完成您的任务。它将包含有限数量的准备好处理您的请求的线程:

int threadPoolSize = 5;
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);

public void receive(Alert a) {
assert a != null;
executor.submit(() -> {
// Do your work here
});
}

这里executor.submit()将在单独的线程中处理您的请求。如果所有线程现在都忙,请求将在队列中等待,防止资源耗尽。它还返回一个 Future 实例,您可以使用它来等待处理完成、设置超时、接收结果、取消执行和许多其他有用的事情。

关于java - 这是生成新线程并终止它们的安全方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38664047/

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