Прямо сейчас у меня в моей программе есть два потока. Один постоянно пытается прочитать ввод от пользователя, а другие - часы. Тайм-аут возникает, если пользователь не отправляет какие-либо данные за определенный промежуток времени. Два потока выглядеть следующим образом:Должен ли я иметь выделенный поток для просмотра таймаута?
Пользовательский ввод нить
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
}
Timeout нить
while(true){
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
else{
//Sleep until it is possible for a timeout to occur
Thread.sleep((timeLastSent+timeoutDuration) - System.currentTimeMillis());
}
}
В настоящее время я эти нити разделены, но я мог бы объединить их, как это ...
while(true){
if(in.hasNextLine()){
processLine(in.nextLine());
timeLastRecieved = System.currentTimeMillis();
}
//Check for a timout
if(timeLastRecieved+timeoutDuration <= System.currentTimeMillis())
timeUserOut();
}
Но мне действительно не нужно часто проверять таймаут. Поэтому я должен комбинировать потоки и слишком часто проверять тайм-аут, или мне нужно иметь два потока. Я не так беспокоюсь о производительности, так как я правильно владею этикетом. Если это означает, что продолжительность таймаута составляет примерно 15 минут.
EDIT: Просто хочу указать, что в версии с двумя потоками я сплю, но в комбинированной версии я никогда не сплю нить. Это, очевидно, вызывает оператор if, который проверяет тайм-аут на выполнение более необходимого.
Если поток чтения для опроса пользователя в любом случае может также обрабатывать таймаут. В конце концов, если я правильно вас понимаю, это тайм-аут для ожидания ввода, и, таким образом, потребительский поток (который опросы) будет тем, что время от времени. Единственная причина, по которой я мог бы проверить отдельную проверку потока на тайм-ауты, будет заключаться в том, что обработка пользовательского ввода займет слишком много времени, и если, например, следующий опрос произойдет через 16 минут, а пользователь предоставит ввод после 15: 30 поток опроса, выполняющий оба варианта, может не распознать тайм-аут. – Thomas
Кроме того, вы можете захотеть положить 'timeLastRecieved = System.currentTimeMillis();' перед обработкой ввода, так как в противном случае время, необходимое для обработки, увеличило бы пороговое значение таймаута - что вы могли бы или не захотели бы сделать. – Thomas
хорошая точка @ Томас. Я не должен беспокоиться о длительности обработки, так как она не должна превышать нескольких миллисекунд, а время ожидания - около 15 минут. Корень моего вопроса заключается в том, лучше ли иметь два эффективных потока или один поток, который более часто выполняет оператор if. – user6629259