首頁 >Java >java教程 >Java 線程轉儲

Java 線程轉儲

WBOY
WBOY原創
2024-08-30 16:03:051152瀏覽

java執行緒轉儲被定義為堆疊記憶體中所有即時處理執行緒的轉儲;它在診斷CPU 使用情況(例如尖峰、死鎖、記憶體問題、具有某些預設錯誤碼的無回應應用程式、請求和回應時間)方面發揮著至關重要的作用,即使其他一些與系統相關的問題也計算並與線程相關基於應用程式伺服器的轉儲訊息,它將配置到伺服器設定檔中,主要建議在JVM 中定期使用超過1 個線程轉儲和至少10 個轉儲線程。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

文法

如果我們使用java程式語言,它可以有預設的類別和方法來建立更複雜的網路應用程式。這裡將使用這裡的工具來分析線程轉儲; 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 中如何運作?

在 Java 應用程式中,我們使用 Web 伺服器和應用程式伺服器在瀏覽器和桌面(如果是獨立應用程式)中執行應用程式。由於我們使用的 Web 伺服器需要存取數十到數百個執行緒來處理大量並髮用戶。如果假設應用程式將被多個使用者訪問,即兩個或多個使用者同時訪問相同的資源,則兩個執行緒之間的爭用是不可避免的,甚至有時會發生死鎖。基於網路伺服器,線程轉儲將被配置為例如; Apache tomcat 將使用像/logs/Catalina.out 這樣的選項來配置線程轉儲,如果我們打開配置文件,我們將配置輸出java 程式碼(如果它存在於涉及的多線程概念中)應用程式伺服器在堆疊追蹤中拋出錯誤和異常。

線程轉儲有不同的狀態來顯示應用程式使用者是否活著,否則 Keep-Alive-Timer 也是一個線程名稱;這應該用於創建 KeepAliveCache 線程,該線程已為活動的 http 線程做好了準備。使用 JVM 建立的每個線程,因為它是在類別線程守護程序之後啟動的,這意味著它無法阻止 JVM 最後運行的線程在機器和應用程式中關閉。

一些最重要的執行緒狀態,如Runnable、Waiting/Timed_waiting 和Blocked,如果應用程式或行程處於多執行緒狀態,那麼每當創建執行緒時,這些狀態將用於阻塞和等待執行緒如果我們執行執行緒處於可運行模式,則在與執行緒優先權相關的幾個元資料(包括作業系統執行緒優先權)之後,將自動轉到Runnable 介面。 如果應用程式在完成後處於多執行緒狀態,則阻塞狀態用於阻塞執行緒。一個線程執行另一個線程,直到它已被鎖定狀態,因此在同步線程塊等概念的幫助下,使用這些概念及其實例已經實現了這一點。等待狀態是計算出執行緒等待時間,並儲存在稱為執行緒池的執行緒記憶體中,它一直等待在這些狀態下工作。

Java 執行緒轉儲範例

下面提到了不同的例子:

範例#1

代碼:

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();
}
}

輸出:

Java 線程轉儲

範例#2

代碼:

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());
}
}

輸出:

Java 線程轉儲

範例 #3

代碼:

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();
}
}

輸出:

Java 線程轉儲

在上面的三個範例中,我們對執行緒轉儲概念使用了不同的場景;此外,我們也使用了不同類型的內建執行緒方法,如notify()、Timed_Waiting()、sleep();這些並發靜態方法將實作java中多執行緒的dump。

結論

通常,執行緒轉儲是基於 Java 的 Web 應用程式的一些有用機制,用於取得詳細的分析報告。它包括多個用戶直接或間接存取應用程式;這些過程將有助於解決中斷並提高應用程式的效能。

以上是Java 線程轉儲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn