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