2013-02-27 4 views
3

Я реализовал прослушиватель Socket для чтения данных, отправленных с GPS, но он достигает 90% моего процессора. Я знаю, что это мой код, вызывающий это, но я не могу видеть, где.Слушатель сокета - УБИЙСТВО моего процессора, как улучшить производительность моего кода?

Это мой основной класс:

public class PortToDB { 

    ServerSocket serverSocket = null; 

    public void listenSocket(){ 
     try{ 
      serverSocket = new ServerSocket(50000); 
     } catch (IOException e) { 
      System.out.println("Could not listen on port 50000. " + e); 
      System.exit(-1); 
     } 

     while(true){ 
      GPSData gd; 
      try{ 
       gd = new GPSData(serverSocket.accept()); 
       Thread t = new Thread(gd); 
       t.start(); 
      } catch (IOException e) { 
       System.out.println("Accept failed: 50000. " + e); 
       System.exit(-1); 
      } 
     } 
    } 

    public static void main(String[] args) {  
     PortToDB portToDb = new PortToDB(); 
     portToDb.listenSocket(); 
    } 
} 

Это мой Runnable Класс:

class GPSData implements Runnable { 

    private Socket client; 
    DBHandler dbhandler = new DBHandler(); 

    GPSData(Socket client) { this.client = client; } 

    public void run(){ 
     String line; 
     BufferedReader in = null; 

    try{ 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
    } catch (IOException e) { 
     System.out.println("in or out failed"); 
     System.exit(-1); 
    } 

    while(true){ 
     try{ 
      if((line = in.readLine()) != null){ 
       dbhandler.dbInsert(line); 
      } 
     } catch (IOException e) { 
      System.out.println("Read failed"); 
      System.exit(-1); 
     } 
    } 
    } 
} 
+0

[Обзор кода] (http://codereview.stackexchange.com/) может помочь/лучше спросить. – Gyhth

+0

Сколько потоков создается в целом, как часто и сколько работает одновременно? Используется ли высокая загрузка процессора сразу после некоторого использования? – hyde

ответ

6

Если readLine() возвращает null, вы должны закрыть розетку, выйти из цикла чтения и забыть об этом клиенте. Вы вращаетесь в EOS.

+0

Простите, что означает EOS? – FeleMed

+0

EOS означает конец потока. – EJP

4

Вместо того чтобы создавать новый поток для каждого входящего запроса, использовать пул потоков:

private ExecutorService executor = Executors.newFixedThreadPool(15); 

// ... 

gd = new GPSData(serverSocket.accept()); 
executor.submit(gd); 

Таким образом, вы исключите накладные расходы на создание неограниченных потоков во время получения запросов и вместо этого создает ограниченные потоки даже до открытия порта сокета для приема запросов.


Кроме того, как сказал @EJB, выход клиента для цикла при каждом приеме null от readLine() как индикатор конца потока (ЭОС).

+0

Что делать, если количество подключений превышает 15? –

+0

@VishalK Они будут ждать, пока нить закончит свою работу. –

+0

Вы также можете добавить небольшой Thread.sleep в прочитанный поток. Это должно уменьшить некоторую нагрузку и позволить некоторым другим потокам возможность обрабатывать там данные – MadProgrammer

0

Спасибо всем, кто ответил на мой вопрос.

Я решил эту проблему путем объединения Eng.Fouad-х и предложение EJP в:

Это то, что я изменил в своем коде:

Исполнитель:

private ExecutorService executor = Executors.newFixedThreadPool(15); 

    try{ 
     gd = new GPSData(serverSocket.accept()); 
     executor.submit(gd); 
    } 

Циклическое управление:

try{    
     while((line = in.readLine()) != null){   
     dbhandler.dbInsert(line); 
     } 
    } 

Теперь процесс остается на 0% :).

Спасибо EJP и Eng.Fouad.

+0

@ Eng.Fouad Я хотел бы знать, согласны ли вы с этим. – FeleMed

+0

@EJP Хотелось бы узнать, согласны ли вы с этим. – FeleMed

+0

Я согласен с * моим * ответом. Я не согласен с тем, что вам нужен пул потоков. * вообще, * если вы не принимаете сотни или тысячи подключений в секунду, когда все, что вы сказали, было «* a * GPS»; и я, конечно же, не согласен с пулом потоков фиксированного размера, равным 15, если вы только не хотите сразу обслуживать 15 клиентов и пусть остальные ждут, что также не упоминается в вашем вопросе. – EJP

Смежные вопросы