【问题标题】:Java thread monitor other threadsJava线程监控其他线程
【发布时间】:2013-06-05 12:14:02
【问题描述】:

我有一个名为 class1 的类,其中有以下代码:

public class class1 {
    public static ServerSocket serverSocket;

     public static void main(String args[]) {        
        try {
            serverSocket = new ServerSocket(1234);
            while (true) {
                class2 t = new class2(serverSocket.accept());
                t.start();
            }
        } catch (IOException ex) {
            Logger.getLogger(LisenerServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

所以在第 1 课中,我为每个连接打开一个新线程。

我还有另一个名为 class2 的类,其中有以下代码:

public class class2 extends Thread {
    private Socket socket;

    public class2(Socket socket) {
        try {
            this.socket = socket;
            in = new BufferedInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
        } catch (IOException ex) {
            Logger.getLogger(ListenerServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
       while (true) {
           try {
               // do something with in and out.
           } catch (IOException ex) {
               System.out.println(ex);
               break;
           } 

       }
    }
}

我希望客户端(不是 java 程序)连接到我的套接字服务器并发送 sting 命令,并且我想知道客户端(我将通过在类 1 中打开的线程名称和/或 id 来识别客户端)是否是连接与否。

我可以创建另一个类,比如说第 3 类,我在其中打开一个线程来持续检查客户端是否已连接?可以的话,可以举个例子吗?

【问题讨论】:

  • 为什么不使用 RMI?
  • stackoverflow.com/questions/2170520/… 等等。您基本上是在问“教我如何在 Java 中进行线程间通信”
  • @Makky 他为什么要首先使用 RMI,他将如何在非 Java 客户端使用它?
  • 好吧,如果他要从非 Java 客户端使用它,那么现有的 solutino 本身将无法工作。
  • 好的,我明白了。 Marko。你是对的。

标签: java multithreading sockets


【解决方案1】:

我希望我的问题是正确的,据我了解,您可以保留一个全球连接客户端列表,例如:

List<class2> MyList;

当 class2 线程启动时,它会将自己添加到列表中:

public class2(Socket socket) {
   try {
      this.socket = socket;
      in = new BufferedInputStream(socket.getInputStream());
      out = new DataOutputStream(socket.getOutputStream());
      MyList.add(this);
   }
   catch (IOException ex) 
   {
       Logger.getLogger(ListenerServerThread.class.getName()).log(Level.SEVERE, null, ex);
   }
}

当线程终止时,它会从列表中删除自己:

Try
{
   while (true) {
      try {
          // do something with in and out.
      } catch (IOException ex) {
         System.out.println(ex);
         break;
      } 
    }
} 
finally {
    for (int i=0; i < MyList.size(), i++)
       if (MyList.get(i) == this) 
       {
           MyList.delete(i);
           break;
       }
}

这样,您可以通过其线程获得已连接客户端的列表。您可以在 class2 中添加一些方法来访问更多信息,例如套接字、运行时间等。此外,您应该考虑使用互斥锁或其他一些同步方法访问此列表(添加/删除时) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多