Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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,如何通过编程检查两个线程是否属于相同或不同的进程?这是我写的一段代码: public class MyThread { public static void main(String[] args) { TestThread1 obj1 = new TestThread1(); TestThread2 obj2 = new TestThread2(); System.out.println("Current thread:" + Threa

如何通过编程检查两个线程是否属于相同或不同的进程?这是我写的一段代码:

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());
        }
    }
}
公共类读取{
公共静态void main(字符串[]args){
TestThread1 obj1=新的TestThread1();
TestThread2 obj2=新的TestThread2();
System.out.println(“当前线程:+thread.currentThread().getName());
螺纹t1=新螺纹(obj1);
t1.start();
螺纹t2=新螺纹(obj2);
t2.start();
}
}
类TestThread1实现可运行{
@凌驾
公开作废运行(){

对于(int i=0;i可能有一种更简单的方法,但是您可以在线程上调用
getStackTrace()
,然后检查它(搜索
run
方法的框架)。但是,这只适用于活动线程


PS您在这里使用了错误的术语,您所指的不是进程,它只是一个定义线程执行的
run
方法的类。

您混合了线程和进程的概念

作为进程TestThread1和线程t2的一部分创建的线程t1 正在作为TestThread2的一部分创建

您的
TestThread1
TestThread2
只是可运行的,它们包含线程应该执行的操作的信息。您的
t1
t2
是实际的线程,它们在同一个进程中运行,因为您是在一个应用程序中启动它们的。应用程序中的所有线程都在同一个java进程中运行,因此您不能假设有两个线程引用,它们属于不同的进程


如果启动另一个java应用程序,它将在不同的进程中运行,但您无法在单个上下文中比较来自不同进程的两个线程。

您对术语的理解或使用有问题

这里我理解的是线程
t1
作为进程
TestThread1
的一部分创建,线程
t2
作为进程
TestThread2
的一部分创建

首先,一些术语:

  • TestThread1
    TestThread2
    是类而不是进程

  • obj1
    obj2
    中的值也不是进程。它们分别是
    TestThread1
    TestThread2
    类的实例

如果我正确地解释了您的问题,您实际上是在问是否有办法确定
t1
t2
是否共享一个
Runnable
实例。不幸的是,在纯Java中没有办法做到这一点。
Thread
对象的
Runnable
是一个私有字段,没有公共getter检索它1

另一方面,如果你真的在问流程

运行应用程序时,只有一个进程,两个线程都属于它



1-可以使用讨厌的反射来检索私有字段的值,但这不是一个好主意。你应该寻找一种方法来做任何你想做的事情,而不需要进行此测试…

我不确定我是否理解这个问题。如果两个线程都存在于JRE中,那么它们都是同一Java进程的一部分。也就是说,即使这个类是从两个不同的VM运行的,VM关于其他VM线程的唯一知识是通过IPC。你的问题还不清楚。你似乎误解了进程和线程的含义。而且,对象不属于线程。java也不考虑哪个线程创建了其他线程。没有父子关系。我的坏。,措词不正确。让我关闭此线程,然后打开另一个。@vmr编辑此线程如何..?属于同一进程的所有线程都共享系统资源,如堆内存和其他资源,但每个线程都有自己的异常处理程序和堆栈。你说得对,我感到困惑。谢谢你解决这个问题。