2013-06-05 95 views
0

我有一个名为class1的中,我有以下代码类:Java线程监视其他线程

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级我打开一个新的线程为每个连接。

而且我有一个名为类2中,我有以下代码另一个类:

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程序)连接到我的socket服务器并发送蜇命令,我想知道如果客户端(我将通过在类别1中打开的线程名称和/或标识符识别客户端)连接或不连接。

我可以让另一个班级让我们说班级3,我打开一个线程来连续检查客户端是否连接?如果可以,请给我举个例子吗?

+0

为什么不使用RMI? – Makky

+0

http://stackoverflow.com/questions/2170520/inter-thread-communication-in-java其他许多人。你基本上是问“教我如何在Java中进行线程间通信” –

+1

@Makky为什么他会首先使用RMI,他将如何从非Java客户端使用它? –

回答

0

我希望我的问题吧,根据我的理解,你可以保持连接的客户端的全局列表,例如:

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中添加一些方法来访问更多信息,比如套接字,运行时间等等。另外,您应该考虑使用互斥锁或其他同步方法访问此列表(添加/删除时) 。