【发布时间】:2018-09-13 13:24:06
【问题描述】:
我有两个 API:一个启动线程,另一个停止线程。我可以通过调用/start API 成功地启动一个线程,但是我无法通过调用/stop API 来停止已经运行的线程。好像Executor#stop() 什么都不做。
我的RestController:
@Autowired
private Executor executor;
@RequestMapping(path = "/start", method = GET)
public ResponseEntity<HttpStatus> startLongTask() {
executor.start();
return ResponseEntity.ok(HttpStatus.OK);
}
@RequestMapping(path = "/stop", method = GET)
public ResponseEntity<HttpStatus> stopLongTask() {
executor.stop();
return ResponseEntity.ok(HttpStatus.OK);
}
我的Executor:
@Component
public class Executor {
@Value("${threads.number}")
private int threadsNumber;
private ExecutorService executorService;
@Autowired
private OtherService otherService;
@PostConstruct
private void init() {
executorService = Executors.newFixedThreadPool(threadsNumber);
executorService = Executors.newScheduledThreadPool(threadsNumber);
}
/**
* Start.
*/
public void start() {
executorService.submit(() -> otherService.methodImExecuting());
}
/**
* Stop.
*/
@PreDestroy
publicvoid stop() {
executorService.shutdownNow();
try {
if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
}
}
}
这是methodImExecuting:
@Component
public class OtherService {
public void methodImExecuting() {
List<SomeObject> dataList = repository.getDataThatNeedsToBeFilled();
for (SomeObject someObject : dataList) {
gatewayService.sendDataToOtherResourceViaHttp(someObject);
}
}
}
【问题讨论】:
-
方法
methodImExecuting如何响应executorService尝试中断它很重要,因此我们需要查看该方法 -
@AndrewTobilko 我已将
methodImExecuting添加到问题中
标签: java multithreading spring-boot executorservice