gpt4 book ai didi

java - 使用 @Scheduled 和 @Async 实现线程安全,Java

转载 作者:行者123 更新时间:2023-12-01 10:34:56 25 4
gpt4 key购买 nike

我使用了这段代码:

private Queue<Object> myQueue = new ConcurrentLinkedQueue();

public enqueue(Object obj) {
myQueue.add(obj);
}

@Scheduled(fixedRate=1000)
public void publish() {
final List objsToPublish = Lists.newArrayList();
final int listSize = myQueue.size();
for (int i = 0; i < listSize; i++) {
objsToPublish.add(myQueue.poll());
}

expensiveWriteOperation(objsToPublish);
}

但是,如果在该软件中运行的某些其他操作期间,publish() 夺走了控制权,则会出现问题,因此我尝试使昂贵的调用异步进行,如下所示:

private Queue<Object> myQueue = new ConcurrentLinkedQueue();

public enqueue(Object obj) {
myQueue.add(obj);
}

@Scheduled(fixedRate=1000)
public void publish() {
final List objsToPublish = Lists.newArrayList();
final int listSize = myQueue.size();
for (int i = 0; i < listSize; i++) {
objsToPublish.add(myQueue.poll());
}

work(objsToPublish);
}

@ASync
void work(List objsToPublish) {
expensiveWriteOperation(objsToPublish);
}

我担心两件事。

1) 即使在任何时候调用 enqueue,甚至在 mid-work() 时,这段代码也能工作吗?

2)我是否以正确的方式从队列中传递数据?

最佳答案

在您的情况下,work() 方法必须是公共(public)的,并且必须从具有 publish() 方法的类外部调用。如果这是 Spring,您很可能使用动态代理,在这种情况下,一旦您从其他地方调用 publish()work() 的 @Async 注释就会生效。 方法不再起作用,因为您已经在代理实例中内部

试试这个:

interface AsyncInternalWrapper {
void work(List objsToPublish);
}


@Service
public class AsyncInternalWrapperImpl implements AsyncInternalWrapper {
@Async
public void work(List objsToPublish) {
expensiveWriteOperation(objsToPublish);
}
}

然后

@Autowired
private AsyncInternalWrapper wrapper;

@Scheduled(fixedRate=1000)
public void publish() {
....

wrapper.work(objsToPublish);
}

顺便说一句,由于这是一个预定的过程,因此不需要用户交互。那么,让 publish() 调用返回更快的真正好处是什么?您可能需要三思而行,考虑一下这个异步操作能提供什么好处(如果有的话),并且不要在没有充分论证的情况下过度设计某些东西。

关于您的担忧,请记住 publish() 将由 Executor 服务在其自己的线程中执行,因此您自然已经在进行“异步”调用。我猜这就是使用并发队列的动力。 @Async 发生的情况是,除了执行 publish()

的线程之外,您还生成(或从线程池中获取)另一个线程

关于java - 使用 @Scheduled 和 @Async 实现线程安全,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818970/

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