簡體   English   中英

以編程方式檢查Java中兩個線程是否屬於同一進程

[英]Programatically check if two threads belong to the same process in Java

如何以編程方式檢查兩個線程是否屬於相同或不同的進程? 這是我編寫的代碼:

public class MyThread {

    public static void main(String[] args) {
        TestThread1 obj1 = new TestThread1();
        TestThread2 obj2 = new TestThread2();
        System.out.println("Current thread:" + Thread.currentThread().getName());
        Thread t1 = new Thread(obj1);
        t1.start();
        Thread t2 = new Thread(obj2);
        t2.start();


    }
}

class TestThread1 implements Runnable {
    @Override
    public void run () {
        for(int i=0; i<1000 ;i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            System.out.println("Current thread:" + Thread.currentThread().getName());
        }
    }
}

class TestThread2 implements Runnable {
    @Override
    public void run () {
        for(int i=0; i<1000 ;i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            System.out.println("Current thread:" + Thread.currentThread().getName());
        }
    }
}

在這里,我了解的是線程t1作為進程TestThread1的一部分創建,線程t2作為TestThread2進程的一部分創建。 但是,我如何以編程方式檢查此內容?

您混合了線程和進程的概念。

線程t1作為進程TestThread1的一部分創建,線程t2作為TestThread2的一部分創建

您的TestThread1TestThread2只是可運行的,它們包含有關信息應由線程執行的操作的信息。 t1t2是實際線程,它們在同一進程中運行,因為您是在一個應用程序中啟動它們的。 應用程序中的所有線程都在同一個Java進程中運行,因此,您不可能有兩個線程引用並且它們屬於不同進程的情況。

如果啟動另一個Java應用程序,它將在不同的進程中運行,但是您將無法在單個上下文中比較來自不同進程的兩個線程。

您的理解或術語使用存在問題。

在這里,我了解的是線程t1作為進程TestThread1一部分創建,線程t2作為TestThread2進程的一部分創建。

首先,一些術語:

  • TestThread1TestThread2是類而不是進程。

  • obj1obj2中的值也不是進程。 它們分別是TestThread1TestThread2類的實例。

如果我正確解釋了您的問題,您實際上是在詢問是否有一種方法可以找出t1t2共享一個Runnable實例。 不幸的是,純Java沒有辦法做到這一點。 Thread對象的Runnable是一個私有字段,沒有公共的獲取方法來獲取它1

另一方面,如果您真的在詢問流程...

當您運行該應用程序時,將只有一個進程,並且兩個線程都屬於該進程。


1-可以使用討厭的反射來檢索私有字段的值,但這不是一個好主意。 您應該尋找一種方法來做您想做的所有事情,而這並不需要此測試...

也許有一種更簡單的方法,但是您可以在線程上調用getStackTrace()然后對其進行檢查(搜索run方法的框架)。 但是,這僅適用於活動線程。

PS在這里您使用了錯誤的術語,您所指的不是一個進程,它只是一個定義了由線程執行的run方法的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM