2

我读过一个客户端-服务器应用程序,客户端通过服务器交互。所以,为此,我想在不同的线程上创建客户端。(如果没有,它们通常会被 IO 阻塞)。

这是我的客户代码:

public class Client {

   //some client code here

   public static void main(String[] args) {
        new Thread() {
            @Override
            public void run() {
                long threadId = Thread.currentThread().getId();
                System.out.println("Client creator thread id: " + threadId);
                                Client c = new Client();
                                // some code to run client
            }

        }.start();
   }
}

我多次运行这个类文件(通过直接在 IDE 中运行,或创建 bat 文件)。而且我注意到它们都在同一个线程上(相同的线程ID)。我无法解释为什么。

我认为我遇到的问题是:我不在同一个类中创建多个线程,而是多次运行这个类。虽然我认为这会产生奇怪的问题,但仍然无法解释原因。

请为我解释一下以及如何纠正这个问题。

谢谢 :)

4

3 回答 3

1

可能是因为您每次都运行一个线程,并且在它结束后您main()再次运行该方法,这会创建另一个具有相同 ID 的线程。根据getID()方法中的文档,预计 id 的相似性,即“当线程终止时,此线程 ID 可能会被重用”。 阅读此处了解更多信息。

于 2013-04-19T12:08:31.840 回答
1

如果您在这样的 for 循环中生成线程:

    public class Client {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {

             new Thread() {
                 @Override
                 public void run() {
                     long threadId = Thread.currentThread().getId();
                     System.out.println("Client creator thread id: " + threadId);
                                     Client c = new Client();
                                     // some code to run client
                 }

             }.start();
        }
    }
 }

您会在一个进程中发现许多具有不同 ID 的线程。如果你只是继续运行 main(),你只是在创建另一个只有一个线程的进程。

于 2013-04-19T12:12:09.527 回答
0

如果您真的想测试/模拟多个客户端,那么您应该启动多个进程。因此,您也不必为创建线程而烦恼。实际上,客户端永远不会在同一个进程中运行(甚至不在同一台机器上?)。那不会让你理解这件事,但我会让你更接近现实。

于 2013-04-19T12:55:30.643 回答