Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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,我有以下代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CheckResults { private int sheepCount = 0; private void incrementAndReport() { synchronized(this) { System.out.print((++shee

我有以下代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CheckResults {
   private int sheepCount = 0;
   private void incrementAndReport() {
      synchronized(this) {
         System.out.print((++sheepCount)+" ");
      }
   }
   public static void main(String[] args) {
      ExecutorService service = null;
      try {
         service = Executors.newFixedThreadPool(20);
         var manager = new CheckResults();
         for(int i = 0; i < 10; i++)
            service.submit(() -> manager.incrementAndReport());
      } finally {
         if(service != null) service.shutdown();
      }
   }
}
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共类检查结果{
私有int sheepCount=0;
私有void incrementAndReport(){
已同步(此){
系统输出打印((++sheepCount)+”);
}
}
公共静态void main(字符串[]args){
ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(20);
var manager=新的检查结果();
对于(int i=0;i<10;i++)
提交(()->manager.incrementAndReport());
}最后{
if(service!=null)service.shutdown();
}
}
}
这只是印刷品

12345678910

现在,在我转到visualVM或其他工具之前,程序将被终止。 那么,获得等待/运行的线程的完整转储的最佳方法是什么呢?它将帮助我理解/验证我的多线程模型。 这可能是一个无关紧要的问题,但我找不到好的评论或帮助


谢谢

您的问题并不完全清楚,但我想您希望在应用程序运行时进行多线程转储

编写一个线程转储例程。也许是这样的:

/`threadDump`方法取自:https://www.baeldung.com/java-thread-dump
专用静态字符串线程转储(布尔锁定监控器、布尔锁定同步器)
{
StringBuffer threadDump=新的StringBuffer(System.lineSeparator());
ThreadMXBean ThreadMXBean=ManagementFactory.getThreadMXBean();
对于(ThreadInfo ThreadInfo:threadMXBean.dumpAllThreads(锁定监视器、锁定同步器))
{
String message=“Thread:”+threadInfo.getThreadId()+“|”+threadInfo.getThreadName();
threadDump.append(message.append(System.lineSeparator());
//附加(threadInfo.toString());
}
返回threadDump.toString();
}
在代码中的适当位置调用该例程。我猜您希望在提交每个任务后捕获线程转储

ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(20);
var manager=新的检查结果();
对于(int i=0;i<10;i++)
{
提交(()->manager.incrementAndReport());
String threadReport=which.threadDump();//对字符串执行您想要的操作,记录它,将它转储到控制台,等等。
}
}最后{
if(service!=null)service.shutdown();
}
或者,您可能希望在提交给executor服务的任务代码中调用线程转储例程

ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(20);
var manager=新的检查结果();
对于(int i=0;i<10;i++)
{
服务提交
(
() -> 
{
manager.incrementAndReport();
String threadReport=which.threadDump();//对字符串执行您想要的操作,记录它,将它转储到控制台,等等。
}
);
}
}最后{
if(service!=null)service.shutdown();
}

您的问题并不完全清楚,但我想您希望在应用程序运行时进行多线程转储

编写一个线程转储例程。也许是这样的:

/`threadDump`方法取自:https://www.baeldung.com/java-thread-dump
专用静态字符串线程转储(布尔锁定监控器、布尔锁定同步器)
{
StringBuffer threadDump=新的StringBuffer(System.lineSeparator());
ThreadMXBean ThreadMXBean=ManagementFactory.getThreadMXBean();
对于(ThreadInfo ThreadInfo:threadMXBean.dumpAllThreads(锁定监视器、锁定同步器))
{
String message=“Thread:”+threadInfo.getThreadId()+“|”+threadInfo.getThreadName();
threadDump.append(message.append(System.lineSeparator());
//附加(threadInfo.toString());
}
返回threadDump.toString();
}
在代码中的适当位置调用该例程。我猜您希望在提交每个任务后捕获线程转储

ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(20);
var manager=新的检查结果();
对于(int i=0;i<10;i++)
{
提交(()->manager.incrementAndReport());
String threadReport=which.threadDump();//对字符串执行您想要的操作,记录它,将它转储到控制台,等等。
}
}最后{
if(service!=null)service.shutdown();
}
或者,您可能希望在提交给executor服务的任务代码中调用线程转储例程

ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(20);
var manager=新的检查结果();
对于(int i=0;i<10;i++)
{
服务提交
(
() -> 
{
manager.incrementAndReport();
String threadReport=which.threadDump();//对字符串执行您想要的操作,记录它,将它转储到控制台,等等。
}
);
}
}最后{
if(service!=null)service.shutdown();
}

一种方法是添加一个
静态扫描仪sc=新扫描仪(System.out)
sc.nextLine()
for
循环之前,在
incrementAndReport()
方法中,因此您的进程将等待几次,直到您按下。是,但这可能不包括t