2013-11-18 3 views
0

Я работаю над сокетами на Java. Дело в том, что мы получаем сигнал от аппаратного устройства, и если устройство не сканируется после определенного интервала (200 мс), зависает. Поэтому мне нужно ускорить эту операцию. Как использовать многозадачность для ускорения следующего кода.Многопоточность с использованием сокета TCP/IP

нет строк здесь нет, как правило, в диапазоне от 250

sock = new Socket("localhost", def.PORT); 

    OutputStream outStream = sock.getOutputStream(); 
    DataOutputStream outDataStream = new DataOutputStream(outStream); 
    /**************** Start Command for CystometryEMG *****************/ 
    outDataStream.writeInt(size); 
    outDataStream.writeInt(command); 
    outDataStream.writeBytes(msg); 

    InputStream input = new BufferedInputStream(sock.getInputStream()); 
    reader = new DataInputStream(input); 

    sock.setSoTimeout(def.SOCKET_READ_TIME_OUT); 
    if (sock.isClosed()) 
     return; 
    size = reader.readInt(); 
    command = reader.readInt(); 
    errorCode = reader.readInt(); 
    NoofCols = reader.readInt(); 
    NoOfRows = reader.readInt(); 

    /************** Now get the input from the device *************/ 

    for (int i = 0; i < NoOfRows; i++) 
     arrPb[i] = reader.readDouble(); 

    for (int i = 0; i < NoOfRows; i++) 
     arrPv[i] = reader.readDouble(); 

    for (int i = 0; i < NoOfRows; i++) 
     arrV[i] = reader.readDouble(); 

    for (int i = 0; i < NoOfRows; i++) 
     arrVn[i] = reader.readDouble(); 

    sock.close(); 
+0

невозможно для 'sock.isClosed()', чтобы быть правдой сразу после вызова 'socket.setSoTimeout()' в той же области «try». Не тратьте время на бессмысленные тесты. – EJP

+0

Hang on .. no loop! Вы постоянно открываете и закрываете сокет? –

+0

@MartinJames У меня не возникло твоего вопроса. Я открываю сокет для каждой операции чтения, а затем закрываю его после завершения операции. Если я держу гнездо открытым, операция чтения не работает. – Chaitannya

ответ

2

расцепить сканирование устройства от всех других операций. Разделите это на две нити. Один поток (frontend) не обрабатывает ничего, кроме сканирования устройства и сохранения данных, полученных в очередь. Этот поток должен работать с максимальным приоритетом. Второй поток (бэкэнд) берет данные из очереди и делает все, что угодно с ним, на досуге. Вероятно, вам понадобятся несколько обратных потоков, и после того, как вы получите эту работу, вам нужно будет настроить количество обратных потоков, чтобы гарантировать, что вы сможете обрабатывать запросы быстрее, чем они получены с устройства, иначе ваша очередь будет слишком большой.

Обратите внимание, однако, что Java, как правило, не является языком реального времени, и даже с выделенным потоком может быть возможно, что поток стороннего интерфейса займет больше времени, чтобы запланировать, что вам может понравиться. Вы можете выполнить поиск в Интернете для «realtime java», чтобы узнать, может ли вам помочь какой-либо из существующих JVM в реальном времени.

Несмотря на это, даже не думают о запуске это на что-нибудь меньше, чем 4-ядерный процессор с

+0

Это именно так. Нитки хорошо выполняют эту работу. Единственное, что есть в исключительном состоянии, - это крушение. – Chaitannya

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