使用Spring创建线程

时间:2017-09-20 18:21:07

标签: java spring multithreading concurrency autowired

我是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管理的。因此,它无法访问任何Autowired组件。解决此问题的方法可以是在外部类中自动装配组件,并将其传递给构造函数中的线程类。

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

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

1 个答案:

答案 0 :(得分:1)

我假设问题是关于初始化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

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

使用@Scope将@Component添加到您的线程中(&#34;原型&#34;)。然后使用@Autowired你的线程并执行taskExecutor.execute(sampleThread)

此处的示例:https://www.mkyong.com/spring/spring-and-java-thread-example/部分:3。Spring Thread Pool + Spring托管bean示例

希望得到这个帮助。