首页 文章

使用Spring创建线程

提问于
浏览
0

我是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 回答

  • 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(“prototype”)将@Component添加到线程中 . 然后使用@Autowired你的线程并执行taskExecutor.execute(sampleThread)

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

    希望这有帮助 .

相关问题