Я делаю несколько экспериментов, чтобы попытаться понять Threads на практике. Посмотрите на следующий фрагмент: это функция main
, которая запускает поток, прослушивающий порт 2020. Этот поток, в свою очередь, прослушивает подключения на этом порту, и, когда клиент подключается, он порождает еще один поток, который немного спит а затем записывается в сокет.Смешное поведение темы в Scala
class MyRunner(s:Socket,num:Int) extends Runnable{
val r = scala.util.Random
def run(): Unit ={
if(num == 5)
Thread.sleep(15000)
else
Thread.sleep(1000)
s.getOutputStream.write(s"My number is ${num}! \n".getBytes)
s.getOutputStream.close()
}
}
// this thread opens a MyRunner thread on each new connection
class MyService extends Runnable{
val serverSocket = new ServerSocket(2020)
var num = 0
def run():Unit = {
while(true){
val socket = serverSocket.accept()
num += 1
(new MyRunner(socket,num)).run()
}
}
}
// main function
object app {
def main(args: Array[String]) {
(new MyService).run
}
}
Теперь я тестирую эту установку. Вот что я сделал: я открыл два окна терминала, и на каждом из них я вошел в команде:
$ for i in `seq 1 5`; do netcat localhost 2020; done
вещи, когда число 5 достигается (в соответствии с условным) на одном из терминалов, другой один не продолжается. Оба клиента останавливаются до завершения 15-секундного таймаута.
Я хотел бы знать, что я делаю неправильно, потому что я думал, что вся цель использования потоков состояла в том, чтобы иметь неблокирующие приложения, которые могут обслуживать клиента, даже если другой занят.
P.S .: Я запускаю это на виртуальной виртуальной машине с 4 доступными процессорами (от общего числа 8 на моей главной машине).
Да. Я знал, что что-то понял. Благодарю. –
У вас есть хороший источник, где вы можете узнать о ThreadPoolExcecutor? – Shondeslitch
@Shondeslitch, глава «параллелизма» в стандартном учебнике Java, вероятно, является хорошим местом для начала: https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html –