2016-05-11 7 views
9

मेरे पास जावा में एक बहु-थ्रेडेड इको सर्वर के लिए एक सरल कोड है (यह ग्राहकों को जो कुछ भी वापस प्राप्त करता है) देता है। मैं थ्रेड आंकड़ों सहित सर्वर के विभिन्न संसाधनों का प्रोफाइल कर रहा हूं। कनेक्ट किए गए ग्राहकों की संख्या के अनुसार इनमें से कुछ आंकड़े नीचे दिए गए हैं। मेरे प्रश्न बेसलाइन के लिए हैं (ग्राहकों के 0 0) गैर-बेसलाइनों की तुलना में!डेमॉन थ्रेड, थ्रेड गिनती, और कुल थ्रेड गिनती

1) जब एक ग्राहक कनेक्ट होता है, तो कुल थ्रेड गिनती 2 से बढ़ जाती है? (बाकी के लिए, यह 1)

2) दो गैर-डिमन धागे क्या हैं ?! और क्यों डिमन शुरू में 1 से बढ़ता है और फिर तय किया जाता है?

क्या वे यादृच्छिक हैं ?!

# clients     0 1 2 3 4 5 6 7 8 9 10 

Total Started Thread Count 15 18 19 20 21 22 23 24 25 26 27 
Thread count    14 16 17 18 19 20 21 22 23 24 25 
Peak thread count   14 16 17 18 19 20 21 22 23 24 25 
Daemon thread count   12 13 13 13 13 13 13 13 13 13 13 

यहां सर्वर के लिए कोड का टुकड़ा है। मैं दोनों आरएमआई (ग्राहकों के लिए मतदान संदेशों के लिए) और सर्वर सॉकेट (ग्राहकों को संदेश भेजने के लिए) का उपयोग कर रहा हूं। यदि अन्य कक्षाओं की आवश्यकता है तो मुझे बताएं।

package test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 
import java.util.Vector; 

public class ServerRMI extends Thread implements Hello { 
    //centralized token manager runs polling server and socket server to receive updated tokens 
    static Vector<String> tokenList= new Vector<String>(); 
    protected Socket clientSocket; 
    static int RMIRegistryPort=9001; 
    static int SocketServerPort=9010; 

    public static void main(String[] args) throws IOException { 
     try { 
      ServerRMI obj = new ServerRMI(); 
      Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); 

      // Bind the remote object's stub in the registry 
      Registry registry = LocateRegistry.createRegistry(RMIRegistryPort); 
      registry.bind("Hello", stub); 
      System.err.println("Server ready"); 
     } catch (Exception e) { 
      System.err.println("Server exception: " + e.toString()); 
      e.printStackTrace(); 
     } 

     ServerSocket serverSocket = null; 
     //initialize token list 
     //A needs to execute first 
     tokenList.add(0,"0"); 

     try { 
      serverSocket = new ServerSocket(SocketServerPort); 
      System.out.println("Connection Socket Created"); 
      try { 
       while (true) { 
        System.out.println("Waiting for Connection"); 
        new ServerRMI(serverSocket.accept()); 
       } 
      } catch (IOException e) { 
       System.err.println("Accept failed."); 
      } 
     } catch (IOException e) { 
      System.err.println("Could not listen on port: "+SocketServerPort); 
     } finally { 
      try { 
       serverSocket.close(); 
      } catch (IOException e) { 
       System.err.println("Could not close port: "+SocketServerPort); 
      } 
     } 
    } 

    private ServerRMI(Socket clientSoc) { 
     clientSocket = clientSoc; 
     start(); 
    } 

    public ServerRMI() {}{ 
     // TODO Auto-generated constructor stub 
    } 

    public void run() { 
     System.out.println("New Communication Thread Started"); 

     try { 
      PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), 
        true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        clientSocket.getInputStream())); 

      String inputLine; 

      while ((inputLine = in.readLine()) != null) { 
       tokenList.add(0,inputLine); 
       System.out.println("Server received: " + inputLine); 
//     System.out.println(" ququ size: "+queue.size()); 
       out.println(inputLine); 

       if (inputLine.equals("Bye.")) 
        break; 
      } 

      out.close(); 
      in.close(); 
      clientSocket.close(); 
     } catch (IOException e) { 
      System.err.println("Problem with Communication Server"); 
     } 
    } 

    public String pollServer() { 
     if(!tokenList.isEmpty()){ 
      String data = tokenList.get(0); 
      System.out.println("Poll data: "+data); 
      return data; 
     } else{ 
      return tokenList.size()+""; 
     } 
    } 
} 
+0

पोस्ट कोड है अपने को स्वीकार आप रूपरेखा उपकरण है कि आप प्रयोग कर रहे हैं में धागा जानकारी देख सकते हैं कृपया – qwwdfsad

+0

। उदाहरण के लिए, 'jconsole' या' jvisualvm' "थ्रेड" टैब में सभी थ्रेड जानकारी दिखाता है। प्रक्रिया में कुछ प्रोफाइलर थ्रेड भी चलेंगे, जो गिनती में शामिल होंगे। –

+1

हम आपके कोड को नहीं जानते हैं, इसलिए मुझे नहीं पता कि हम कैसे जवाब दे सकते हैं। अगर मैं आप थे, तो मैं थ्रेड डंप करता हूं जब क्लाइंट का 0 0 होता है, तो जब यह 1 होता है और उनकी तुलना करता है, तो आपको अपना उत्तर –

उत्तर

3

मुझे यकीन है कि क्या आप उन कनेक्शन, लेकिन आम तौर पर चौखटे कि TCP कनेक्शन Netty गैर अवरुद्ध करना पोर्ट और एक थ्रेड पूल incomming कनेक्शन को संभालने के लिए सुनने के लिए एक मास्टर धागा का उपयोग संभाल प्राप्त करने के लिए उपयोग नहीं कर रहा हूँ। इसका मतलब है कि अगर थ्रेड-पूल 1 थ्रेड तक सीमित है तो यह कम से कम 2 थ्रेड को असामान्य कनेक्शन के लिए खोल देगा।

नेटटी पेज से यह example देखें, जहां सर्वर को बूटस्ट्रैप करते समय 2 NioEventLoopGroups का उपयोग किया जाता है।

आने वाले यातायात को अवरुद्ध करने के लिए 2 धागे आवश्यक नहीं हैं।

+0

मैंने सर्वर के लिए कोड का टुकड़ा जोड़ा। –

+0

सॉकेट प्राप्त होने तक आपका कोड मुख्य थ्रेड को अवरुद्ध करता है। '' 'प्रारंभ();' '' के अंदर क्या होता है क्योंकि कनेक्शन को स्वीकार करने के बाद पहली बार इस विधि को बुलाया जाता है। –

3

मुझे उम्मीद है कि आपने VisualVM प्रोफाइलर में थ्रेड नामों की समीक्षा की है। आम तौर पर धागे के नाम आपको कुछ विचार बताते हैं कि क्या शुरू किया गया है।

विज्ञापन 1) यह कुछ टीसीपी/आईपी पृष्ठभूमि (क्लीनर, परादाता) धागा बहुत अच्छी तरह से हो सकता है जो आपके पास बाहर से कुछ टीसीपी/आईपी कनेक्शन जैसे ही हो जाता है।

क्या होता है जब ग्राहक 0 पर वापस जाते हैं। क्या अतिरिक्त धागा गायब हो जाता है?

उत्तर JVM विक्रेता और संस्करण के आधार पर बहुत अलग भिन्न हो सकते हैं। तो मुझे लगता है कि आपको सॉकेट और धागे के बारे में जेवीएम इंटर्नल्स में देखना होगा।

उदाहरण नीचे और अधिक सीधे आगे (RMI के बिना) के

import java.net.*; // for Socket, ServerSocket, and InetAddress 
import java.io.*; // for IOException and Input/0utputStream 

public class TCPEchoServer { 

    private static final int BUFSIZE = 32; // Size of receive buffer 
    public static void main(String[] args) throws lOException { 
     if (args.length != i) // Test for correct # of args 
      throw new lllegalArgumentException("Parameter(s): <Port>"); 
     int servPort = Integer.parselnt(args[0]); 
     // Create a server socket to accept client connection requests 
     ServerSocket servSock = new ServerSocket(servPort); 
     int recvMsgSize; // Size of received message 
     byte[] byteBuffer = new byte[BUFSlZE]; // Receive buffer 

    } 

    for (;;) { // Run forever, accepting and servicing connections 
     Socket clntSock = servSock.accept(); // Get client connection 
     System.out.println("Handling client at " + 
      clntSock.getInetAddress().getHostAddress() + " on port " + 
      clntSock, getPort()); 
     InputStream in = clntSock, getlnputStream(); 
     OutputStream out = clntSock.getOutputStream(); 
     // Receive until client closes connection, indicated by-i return 
     while ((recvMsgSize = in .read(byteBuffer)) != -I) 
      out.write(byteBuffer, O, recvMsgSize); 
     clntSock, close(); 
    } 
} 
+0

यदि सर्वर मदद करता है तो मैंने सर्वर के लिए कोड का एक टुकड़ा जोड़ा। –

+0

मैंने देखा .. क्या आपको वास्तव में आरएमआई की आवश्यकता है? क्या आप एक ही सबनेट प्रतिबंध के बारे में जानते हैं? –

+0

ठीक है, ग्राहक वास्तव में राज्य मशीनें हैं जो केवल डेटा मतदान करके काम कर सकती हैं। आरएमआई एकमात्र तरीका है जिसे हम कर सकते हैं। –

संबंधित मुद्दे