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
Java 是否可以获取正在运行的线程的引用?_Java_Multithreading - Fatal编程技术网

Java 是否可以获取正在运行的线程的引用?

Java 是否可以获取正在运行的线程的引用?,java,multithreading,Java,Multithreading,这是我在社区的第一篇帖子。欢迎提出任何意见和建议。 我在端点上有一个web服务。此服务执行一个可运行的类。在执行Runnable之后,是否可以使用单独的服务调用检查/监视线程 我仍在工作和寻找一些东西,如执行服务,但仍然没有运气。还有别的办法吗?请提出一些可能的解决方案,我可以检查一下。对不起我的语法。我希望我能用下面的示例代码清楚地解释它 我的代码是这样的 在以下服务器上运行线程: 我的跑步课 public class Report { private String status;

这是我在社区的第一篇帖子。欢迎提出任何意见和建议。 我在端点上有一个web服务。此服务执行一个可运行的类。在执行Runnable之后,是否可以使用单独的服务调用检查/监视线程

我仍在工作和寻找一些东西,如执行服务,但仍然没有运气。还有别的办法吗?请提出一些可能的解决方案,我可以检查一下。对不起我的语法。我希望我能用下面的示例代码清楚地解释它

我的代码是这样的

在以下服务器上运行线程:

我的跑步课

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
     }
}