Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何将@Autowire多任务提交给ExecutorService_Multithreading_Spring_Autowired - Fatal编程技术网

Multithreading 如何将@Autowire多任务提交给ExecutorService

Multithreading 如何将@Autowire多任务提交给ExecutorService,multithreading,spring,autowired,Multithreading,Spring,Autowired,我有一个@预定的服务 @Controller public class CheckInstanceStatus { @Autowired private CheckStatusTask checkStatusTask; @Autowired private InstanceQueue instanceQueue; private ThreadPoolExecutor executor; @PostConstruct void ini

我有一个
@预定的
服务

@Controller
public class CheckInstanceStatus {

    @Autowired
    private CheckStatusTask checkStatusTask;

    @Autowired
    private InstanceQueue instanceQueue;

    private ThreadPoolExecutor executor;

    @PostConstruct
    void init() {
        executor = new ThreadPoolExecutor(20, 20, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
    }

    @Scheduled(fixedDelay = 2000)
    public void checkInstanceStatus()
    {
        String instName = instanceQueue.poll();
        checkStatusTask.setInstName(instName);
        executor.submit(checkStatusTask);
    }
}
@控制器
公共类CheckInstanceStatus{
@自动连线
私有CheckStatusTask CheckStatusTask;
@自动连线
私有InstanceQueue InstanceQueue;
私有线程池执行器;
@施工后
void init(){
executor=新的ThreadPoolExecutor(20,20,0L,TimeUnit.ms,new LinkedBlockingQueue());
}
@计划(固定延迟=2000)
public void checkInstanceStatus()
{
String instName=instanceQueue.poll();
checkStatusTask.setInstName(instName);
执行者提交(检查状态任务);
}
}
在本例中,我只能向线程池提交一个任务。我想获取队列中的所有(或部分)对象,并将它们放入任务列表(
列表
)中,然后将它们全部提交到线程池,但我不知道如何在spring中创建任务列表(
列表


我是否需要封装
任务列表
@Autowired
它?在
TaskList
中有一个
List
成员来存储任务列表。

否,您不需要将任务列表封装到它自己的类中。Spring将自动填充您自动关联的任何通用类型的列表。有关详细信息,请参阅文档

还可以从中提供特定类型的所有bean
ApplicationContext
将注释添加到 需要该类型的数组。。。这同样适用于打字 收藏

在这种情况下:

@Autowired
private List<CheckStatusTask> checkStatusTasks;
@Autowired
私有列表检查任务;

不,您不需要将任务列表封装到它自己的类中。Spring将自动填充您自动关联的任何通用类型的列表。有关详细信息,请参阅文档

还可以从中提供特定类型的所有bean
ApplicationContext
将注释添加到 需要该类型的数组。。。这同样适用于打字 收藏

在这种情况下:

@Autowired
private List<CheckStatusTask> checkStatusTasks;
@Autowired
私有列表检查任务;

建议在配置类(XML配置)中设置TaskExecutor Bean(调度程序Bean),如下面的示例所示。 然后必须使用
@EnableAsync
注释配置类

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    // taskExecutor properties...
    return taskExecutor;
}
@Component
@Scope("prototype")
public class CheckStatusTask {

    // ...    
    @Async
    public void doTask(String instName) throws InterruptedException {
        System.out.println("task: " + instName + "#" + new SimpleDateFormat("ddMMyyyy_HHmmss:SSS").format(Calendar.getInstance().getTime()));
        //Thread.sleep(3000);
    }
    // ...
}
在XML中:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
默认情况下,在方法上指定@Async时,将使用的执行器是提供给注释驱动元素的执行器,如上所述

要填写
列表
,请实例化CheckStatusTask类型的各个对象并添加它们:

CheckStatusTask cst = new CheckStatusTask();
tasks.add(cst);
// cst.doTask("Task");
最后,您只需通过迭代列表来调用每个doTask方法。也许您可以直接调用此函数(在@Scheduled方法中)而不是 迭代并填充列表:

for (CheckStatusTask statusTask : getTasks()){
    statusTask.doTask("Task");
}

建议将TaskExecutorbean(调度程序Bean)放在配置类(XMLConfig)中,如下面的示例所示。 然后必须使用
@EnableAsync
注释配置类

@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    // taskExecutor properties...
    return taskExecutor;
}
@Component
@Scope("prototype")
public class CheckStatusTask {

    // ...    
    @Async
    public void doTask(String instName) throws InterruptedException {
        System.out.println("task: " + instName + "#" + new SimpleDateFormat("ddMMyyyy_HHmmss:SSS").format(Calendar.getInstance().getTime()));
        //Thread.sleep(3000);
    }
    // ...
}
在XML中:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
默认情况下,在方法上指定@Async时,将使用的执行器是提供给注释驱动元素的执行器,如上所述

要填写
列表
,请实例化CheckStatusTask类型的各个对象并添加它们:

CheckStatusTask cst = new CheckStatusTask();
tasks.add(cst);
// cst.doTask("Task");
最后,您只需通过迭代列表来调用每个doTask方法。也许您可以直接调用此函数(在@Scheduled方法中)而不是 迭代并填充列表:

for (CheckStatusTask statusTask : getTasks()){
    statusTask.doTask("Task");
}

我还没有测试,但我想知道,在
@Autowired
之后,列表的大小是多少?我没有在
applicationcontext.xml
中定义
CheckStatusTask
bean。
CheckStatusTask
对象是动态生成的,不能在
applicationcontext.xml
中预定义。这对我来说可以吗?我还没有测试,但我想知道,在
@Autowired
之后,列表的大小是多少?我没有在
applicationcontext.xml
中定义
CheckStatusTask
bean。
CheckStatusTask
对象是动态生成的,不能在
applicationcontext.xml
中预定义。这对我来说可以吗?您有什么版本的Spring(模块)以及在哪里定义TaskExecutor(配置)?Spring 4.1.7版本和
TaskExecutor
在我的例子中是
ThreadPoolExecutor
,它被定义为
CheckInstanceStatus
的成员,并在
@PostConstruct
中初始化。您有什么版本的Spring(模块)以及在哪里定义TaskExecutor(配置)?Spring 4.1.7版本和
TaskExecutor
在我的例子中是
ThreadPoolExecutor
,它被定义为
CheckInstanceStatus
的成员,并在
@PostConstruct
中初始化。