Java 是否可以获取正在运行的线程的引用?
这是我在社区的第一篇帖子。欢迎提出任何意见和建议。 我在端点上有一个web服务。此服务执行一个可运行的类。在执行Runnable之后,是否可以使用单独的服务调用检查/监视线程 我仍在工作和寻找一些东西,如执行服务,但仍然没有运气。还有别的办法吗?请提出一些可能的解决方案,我可以检查一下。对不起我的语法。我希望我能用下面的示例代码清楚地解释它 我的代码是这样的 在以下服务器上运行线程: 我的跑步课Java 是否可以获取正在运行的线程的引用?,java,multithreading,Java,Multithreading,这是我在社区的第一篇帖子。欢迎提出任何意见和建议。 我在端点上有一个web服务。此服务执行一个可运行的类。在执行Runnable之后,是否可以使用单独的服务调用检查/监视线程 我仍在工作和寻找一些东西,如执行服务,但仍然没有运气。还有别的办法吗?请提出一些可能的解决方案,我可以检查一下。对不起我的语法。我希望我能用下面的示例代码清楚地解释它 我的代码是这样的 在以下服务器上运行线程: 我的跑步课 public class Report { private String status;
public class Report {
private String status;
@Override
public void run() {
//Update status
setStatus("Running");
//... do stuff
//Update status
setStatus("End")
}
// Getter and Setter
}
我的棋盘格课
使用线程ID可能不是最好的主意,特别是因为您可能会使用重用线程的池。 一个简单的解决方案是为作业生成ID,并维护一个可用于读取状态的映射 例如,您可以为任务ID使用唯一ID:
Map<String, Report> jobs = new ConcurrentHashMap<>();
ExecutorService executorService = Executors.newFixedThreadPool(10); //just an example
public String runReport {
// Run the the runnable
Report report = new Report();
//For a numeric sequence, you can use something like AtomicLong
String jobId = UUID.randomUUID().toString();
jobs.put(jobId, report);
//using a thread pool may be a better idea.
executorService.submit(report);
// return the job ID
return jobId;
}
然后,您只需要知道何时根据希望调用
check
方法的方式从映射中删除条目。使用线程ID可能不是最好的主意,特别是因为您可能会使用重用线程的池。
一个简单的解决方案是为作业生成ID,并维护一个可用于读取状态的映射
例如,您可以为任务ID使用唯一ID:
Map<String, Report> jobs = new ConcurrentHashMap<>();
ExecutorService executorService = Executors.newFixedThreadPool(10); //just an example
public String runReport {
// Run the the runnable
Report report = new Report();
//For a numeric sequence, you can use something like AtomicLong
String jobId = UUID.randomUUID().toString();
jobs.put(jobId, report);
//using a thread pool may be a better idea.
executorService.submit(report);
// return the job ID
return jobId;
}
然后,您只需要根据希望调用
check
方法的方式,知道何时从映射中删除条目。在作业id的类中维护映射。
每当该线程初始化时,在构造函数中传递id,当它开始处理时,将状态设置为running,当它完成时,在run方法中结束执行之前,将状态设置为end。像下面这样
public void run(){
try{
jobsMap.put(this.jobId, "Running");
// your business logic here
jobsMap.put(this.jobId,"Completed");
} catch(Exception e){
jobsMap.put(this.jobId,"Failed. Reason -"+e.getMessage);
// exception handling
}
}
在作业id的类中维护地图。 每当该线程初始化时,在构造函数中传递id,当它开始处理时,将状态设置为running,当它完成时,在run方法中结束执行之前,将状态设置为end。像下面这样
public void run(){
try{
jobsMap.put(this.jobId, "Running");
// your business logic here
jobsMap.put(this.jobId,"Completed");
} catch(Exception e){
jobsMap.put(this.jobId,"Failed. Reason -"+e.getMessage);
// exception handling
}
}
Thread.currentThread()
?显然我无法在检查中使用当前线程,因为它在不同的调用中。我需要的是获取调用期间传递的具有特定ID的线程,然后检查该线程的状态。您需要维护一个将线程ID映射到该线程的Map
。但是要小心:一旦一个线程被终止,id可能会被重用!不过,可能还有其他(更好的)解决方案。但是这个问题有点太宽泛了。也许这有帮助:谢谢@Seelenvirtuose,现在我从你关于维护地图的回答中得到了一个新的想法。我还可以使用DB中的表来获取报告的详细信息。但是我仍然在寻找一些方法来做这件事。Thread.currentThread()
?显然我不能在检查中使用当前线程,因为它在不同的调用中。我需要的是获取调用期间传递的具有特定ID的线程,然后检查该线程的状态。您需要维护一个将线程ID映射到该线程的Map
。但是要小心:一旦一个线程被终止,id可能会被重用!不过,可能还有其他(更好的)解决方案。但是这个问题有点太宽泛了。也许这有帮助:谢谢@Seelenvirtuose,现在我从你关于维护地图的回答中得到了一个新的想法。我还可以使用DB中的表来获取报告的详细信息。但我仍然在寻找一些方法来做到这一点。这是简短而有用的,谢谢@ernest_k。我目前正在阅读一篇关于ExecutorService和ThreadPool的文章。这篇文章简短而有用,谢谢@ernest_k。我正在阅读一篇关于ExecutorService和ThreadPool的文章。感谢@Somil Aseeja的建议。我也会考虑这一点。谢谢你的建议。我也会考虑这个问题。
public void run(){
try{
jobsMap.put(this.jobId, "Running");
// your business logic here
jobsMap.put(this.jobId,"Completed");
} catch(Exception e){
jobsMap.put(this.jobId,"Failed. Reason -"+e.getMessage);
// exception handling
}
}