gpt4 book ai didi

java - 使用 Spring 创建线程

转载 作者:行者123 更新时间:2023-12-02 12:13:57 25 4
gpt4 key购买 nike

我是 Spring 新手,正在尝试实现一个多线程程序。根据此链接中的 Spring 文档,https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html ,可以像这样创建线程,

public class TaskExecutorExample {
private class MessagePrinterTask implements Runnable {
private String message;
public MessagePrinterTask(String message) {
this.message = message;
}
public void run() {
System.out.println(message);
}
}

private TaskExecutor taskExecutor;
public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new MessagePrinterTask("Message" + i));
}
}
}

但是“Thread”是使用“new”关键字创建的,并且该 bean 不由 Spring 管理。因此它无法访问任何 Autowiring 的组件。解决此问题的方法是在外部类中 Autowiring 组件,并将其传递给其构造函数中的线程类。

但是有没有其他正确的方法可以做到这一点,Spring 可以负责初始化线程,以便线程可以访问所有自动连接的组件。

我正在创建的应用程序必须为从队列接收到的每条新消息创建一个新线程。

最佳答案

我假设问题是关于如何初始化TaskExecutor并使用它?!因此,文档展示了执行此操作的方法:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="25" />
</bean>

<bean id="taskExecutorExample" class="TaskExecutorExample">
<constructor-arg ref="taskExecutor" />
</bean>

或者您可以在代码中使用 @Bean 进行操作,例如

    @Bean
public ThreadPoolTaskExecutor threadPool() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(5);
pool.setMaxPoolSize(10);
pool.setQueueCapacity(25);
return pool;
}

@Bean
public TaskExecutorExample executorExample() {
return new TaskExecutorExample(threadPool());
}

然后你可以@Autowired来使用它。关于corePoolSizemaxPoolSizequeueCapacity的详细信息,可以引用这里:http://www.bigsoft.co.uk/blog/index.php/2009/11/27/rules-of-a-threadpoolexecutor-pool-size

编辑1:在得到萨摩的澄清后,我想将其更新为:

使用 @Scope("prototype") 将 @Component 添加到您的线程。然后使用@Autowired你的线程并执行taskExecutor.execute(sampleThread)

示例在这里:https://www.mkyong.com/spring/spring-and-java-thread-example/部分:3.Spring线程池+Spring托管bean示例

希望这有帮助。

关于java - 使用 Spring 创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46329200/

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