以编程方式检查两个线程是否属于Java中的同一进程

时间:2015-06-14 14:14:37

标签: java multithreading

如何以编程方式检查两个线程是否属于相同或不同的进程?这是我写的代码片段:

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进程的一部分创建的。但是我如何以编程方式检查这个?

3 个答案:

答案 0 :(得分:2)

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

  

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

您的TestThread2t1只是runnables,它保存信息应由线程执行的操作。您的t2 func didBeginContact(contact: SKPhysicsContact) { let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask if collision == PhysicsCategory.player | PhysicsCategory.wall { } else if collision == PhysicsCategory.player | PhysicsCategory.box { player.setJump(true) } else if collision == PhysicsCategory.player | PhysicsCategory.floor { player.setJump(true) } if collision == PhysicsCategory.laser | PhysicsCategory.wall { effects = SKEmitterNode(fileNamed: "Explosion.sks") addChild(effects!) laser!.removeFromParent() } else if collision == PhysicsCategory.laser | PhysicsCategory.floor { effects = SKEmitterNode(fileNamed: "Explosion.sks") addChild(effects!) laser!.removeFromParent() } 是实际线程,它们在同一个进程中运行,因为您在一个应用程序中启动它们。应用程序中的所有线程都在同一个java进程中运行,因此您不会遇到两个线程引用并且它们属于不同进程的情况。

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

答案 1 :(得分:2)

您对术语的理解或使用存在问题。

  

据我所知,线程t1是作为流程TestThread1的一部分创建的,线程t2是作为TestThread2流程的一部分创建的。

首先,一些术语:

  • TestThread1TestThread2是不是流程的类。

  • obj1obj2中的值也不是进程。它们分别是TestThread1TestThread2类的实例。

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

另一方面,如果您真的询问流程......

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

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

答案 2 :(得分:0)

也许有一种更简单的方法,但您可以在线程上调用getStackTrace()然后检查它(搜索run方法的框架)。但是,这仅适用于实时线程。

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