java线程转储被定义为堆栈内存中所有实时处理线程的转储;它在诊断 CPU 使用情况(例如尖峰、死锁、内存问题、具有某些默认错误代码的无响应应用程序、请求和响应时间)方面发挥着至关重要的作用,即使其他一些与系统相关的问题也计算并与线程相关基于应用程序服务器的转储消息,它将配置到服务器配置文件中,主要建议在 JVM 中定期使用超过 1 个线程转储和至少 10 个转储线程。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
如果我们使用java编程语言,它可以有默认的类和方法用于创建更复杂的Web应用程序。这里将使用这里的工具来分析线程转储; java 线程转储的基本语法如下。
class className { public static void main(String[] args) throws Exception { Object o = new Object(); Object o1= new Object(); Thread t=new Thread(new DeadLockRunnable(o,o1)); t.sleep(); --some java code logics--- } }
上面的代码是借助死锁等概念在堆栈内存中创建线程转储的基本语法。此外,我们还可以使用一些默认方法,例如 DeadLockRunnable、 ManagementFactory.getThreadMXBean();这些是在编程堆栈中实现线程转储的一些方法。
在 Java 应用程序中,我们使用 Web 服务器和应用程序服务器在浏览器和桌面(如果是独立应用程序)中运行应用程序。由于我们使用的 Web 服务器需要访问数十到数百个线程来处理大量并发用户。如果假设应用程序将被多个用户访问,即两个或多个用户同时访问相同的资源,则两个线程之间的争用是不可避免的,甚至有时会发生死锁。基于网络服务器,线程转储将被配置为例如; Apache tomcat 将使用像
线程转储有不同的状态来显示应用程序用户是否活着,否则 Keep-Alive-Timer 也是一个线程名称;这应该用于创建 KeepAliveCache 线程,该线程已为活动的 http 线程做好了准备。使用 JVM 创建的每个线程,因为它是在类线程守护进程之后启动的,这意味着它无法阻止 JVM 最后运行的线程在机器和应用程序中关闭。
一些最重要的线程状态,如 Runnable、Waiting/Timed_waiting 和 Blocked,如果应用程序或进程处于多线程状态,那么每当创建线程时,这些状态将用于阻塞和等待线程如果我们运行线程处于可运行模式,则在与线程优先级相关的几个元数据(包括操作系统线程优先级)之后,将自动转到 Runnable 接口。 如果应用程序在完成后处于多线程状态,则阻塞状态用于阻塞线程。一个线程执行另一个线程,直到它已被锁定状态,因此在同步线程块等概念的帮助下,使用这些概念及其实例已经实现了这一点。等待状态是计算出线程等待时间,并将其存储在称为线程池的线程内存中,它一直等待在这些状态下工作。
下面提到了不同的示例:
代码:
package com.first; import java.net.ServerSocket; import java.net.Socket; public class Example { public void run() { System.out.println("Multithreads names are : " + Thread.currentThread().getName()); } public static void main(String[] args) throws Exception { long waitingtimethread = 2000 * 30 * 2; long startingthread = System.currentTimeMillis(); Thread t = new Thread(); t.start(); Thread.sleep(300); t.run(); try ( ServerSocket s = new ServerSocket(3000); Socket s1 = s.accept() ) { Thread t1 = new Thread(); t1.start(); while (t1.isAlive()) { if (demo(startingthread, waitingtimethread, t1)) { t1.interrupt(); t1.join(); } } } catch (Exception e) { System.err.println("The Excetion will be captured here."+e); } System.out.println("Multithreads names are : " + Thread.currentThread().getName()); System.out.println("We can check the daemon thread is used or not: " + Thread.currentThread().isDaemon()); } static boolean demo(long startingthread, long waitingtimethread, Thread t1) { return ((System.currentTimeMillis() - startingthread) > waitingtimethread) && t1.isAlive(); } }
输出:
代码:
package com.first; import java.net.ServerSocket; import java.net.Socket; public class Example { static boolean demo(long startingthread, long waitingtimethread, Thread t1) { return ((System.currentTimeMillis() - startingthread) > waitingtimethread) && t1.isAlive(); } public static void main(String[] args) throws Exception { long waitingtimethread = 2000 * 30 * 2; long startingthread = System.currentTimeMillis(); Thread t = new Thread(); Thread t2 = new Thread(); t.start(); Thread.sleep(300); t.run(); try ( ServerSocket s = new ServerSocket(3000); Socket s1 = s.accept() ) { Thread t1 = new Thread(); t1.start(); while (t1.isAlive()) { if (demo(startingthread, waitingtimethread, t1)) { t1.interrupt(); t1.join(); t1.notifyAll(); t2.notify(); } } } catch (Exception e) { e.printStackTrace(); } System.out.println("Multithreads names are : " + Thread.currentThread().getName()); } }
输出:
代码:
package com.first; public class Example extends Thread { public void run() { System.out.println("Multithreads names are : " + Thread.currentThread().getName()); System.out.println("We can check the daemon thread is used or not: " + Thread.currentThread().isDaemon()); } public static void main(String[] args) { Example e1 = new Example(); Example e2 = new Example(); e1.start(); e1.setDaemon(true); e2.start(); } }
输出:
在上面的三个示例中,我们对线程转储概念使用了不同的场景;此外,我们还使用了不同类型的内置线程方法,如notify()、Timed_Waiting()、sleep();这些并发静态方法将实现java中多线程的dump。
通常,线程转储是基于 Java 的 Web 应用程序的一些有用机制,用于获取详细的分析报告。它包括多个用户直接或间接访问应用程序;这些过程将有助于解决中断并提高应用程序的性能。
以上是Java 线程转储的详细内容。更多信息请关注PHP中文网其他相关文章!