gpt4 book ai didi

java - 如何在 Java 中中断/停止工作线程(非当前线程)

转载 作者:行者123 更新时间:2023-11-30 05:20:35 25 4
gpt4 key购买 nike

大家好

我想停止一个工作线程,而不是当前线程

我不想这样

Thread. currentThread().interrupt()

因为它仅适用于同一方法 block 中的当前线程

我想通过名称阻止任何线程

note:

这种方式不起作用,因为我的线程不是当前线程,并且 interrupt() 方法仅适用于我提到的当前线程

Set<Thread> setOfThread = Thread.getAllStackTraces().keySet();

//Iterate over set to find yours
for(Thread thread : setOfThread){
if(thread.getId()==yourThread.getId()){
thread.interrupt();
}
}

the following is my code

@Bean(name = "threadPoolExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
executor.setThreadNamePrefix("threadPoolExecutor-");
executor.initialize();
return executor;
}

@Async("threadPoolExecutor")
public void MyTask(){
System.out.println("Currently Executing thread name - " +
Thread.currentThread().getName());
System.out.println("User created with thread pool executor");
}

所以当我执行 MyTask() 时它需要一个名称

我的问题是,我想在 x 时间后按其名称停止此进程,并且仅当我请求 stop() 方法时,只要线程仍在工作

e.g.

@GetMapping(value="/stopThreadByName/{threadname}")
public String stop(@PathVariable("threadname") String name) {
//some code to stop the thread by its name
}

最佳答案

您可能需要维护线程名称和任务的 Future 引用的映射。

public static Map<String, Future> futureMap = new HashMap<String, Future>();

@Async("threadPoolExecutor")
public Future<String> MyTask(String name){
...
Future<String> obj = new AsyncResult<String>("something");
futureMap.put(name, obj);
return obj;
}


futureMap.put(taskName, executor.submit(task));

当您调用停止时,

@GetMapping(value="/stopThreadByName/{threadname}")
public String stop(@PathVariable("threadname") String name) {
//some code to stop the thread by its name
Future taskNeedsToBeStop = futureMap.get("taskNeedsToBeStop");
taskNeedsToBeStop.cancel(true);
}


在这里,

<T> Future<T> submit(Callable<T> task)

提交一个返回值的任务来执行,并返回一个代表任务待处理结果的Future。 Future 的 get 方法将在成功完成后返回任务的结果。
如果您想立即阻止等待任务,可以使用 result = exec.submit(aCallable).get();

形式的结构
boolean cancel(boolean mayInterruptIfRunning)

尝试取消此任务的执行。如果任务已完成、已取消或由于某些其他原因无法取消,则此尝试将失败。如果成功,并且调用 cancel 时该任务尚未启动,则该任务永远不应运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应中断执行此任务的线程以尝试停止该任务。
该方法返回后,后续调用 isDone() 将始终返回 true。如果此方法返回 true,则对 isCancelled() 的后续调用将始终返回 true。

关于java - 如何在 Java 中中断/停止工作线程(非当前线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59645228/

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