我已经用Java编写了一个简单的ECHO协议服务器,使用Thread
。
很简单:
ServerSocket serverSocket = new ServerSocket(7000, 0, InetAddress.getByName("127.0.0.1"));
while (true) {
Socket socket = serverSocket.accept();
new Thread(() -> {
try (Socket s = socket;
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()))) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.write(inputLine + '\n');
out.flush();
}
} catch (IOException e) {
}
}).start();
}
线程正在inputLine=in.readLine()
上等待客户端的输入。但是我发现所有的工作线程都处于RUNNABLE
状态,通过jstack
,我认为它们可能处于WAITING
状态。
线程在等待数据到达时被阻塞,但为什么在这里它是可运行的?
下面是jstack
输出:
"Thread-0" #10 prio=5 os_prio=31 tid=0x00007f9f8282e800 nid=0x1307 runnable [0x000070000623a000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
- locked <0x000000076b167a18> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
- locked <0x000000076b167a18> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at EchoServer3.lambda$main$0(EchoServer3.java:20)
WAITING
表示一个Java线程正在等待另一个Java线程释放Java对象锁。
Java不知道操作系统块、锁或调度。因此,Java线程在等待输入时可能被阻塞的事实并不影响Java对其状态的看法。
Java线程的run()方法在线程启动时由该线程上的JVM调用。要让线程做一些事情,您可以创建thread的子类并重写它的run()方法,或者(最好)您可以为线程的构造函数提供一个Runnable。那很好。 当时我正在创建Thread的子类并重写run,我意识到我不能像预期的那样使方法受到保护,因为Thread.run()是公共的。然后我意识到为什么:它必须是公共的,因为Thread实现了Runn
在使用CPU的高负载应用程序上进行线程转储,我看到很多线程处于这种状态: “ajp executor threads-XXXXXX”prio=10 tid=0x00002b04b8b33801 nid=0x5327可运行[0x0000000000000000]java。lang.Thread。状态:可运行 对我来说,真正奇怪的是根本没有堆栈跟踪,ajp线程的总数高于配置的最大线程数(见下文) 当应
问题内容: 最近,我正在用Java开发多线程。想了解一个线程是否处于阻塞状态为什么不能被中断?为何只有在等待状态下才能中断线程?基本上,为什么我们需要两个可以被中断而另一个不能被中断的线程状态? 这个问题可能是非常基本的,但是,我试图理解事物,而不仅仅是记住它们。 问题答案: 有人认为您的意思是导致线程停止其当前操作并抛出?Java中的线程中断只是一个标志。您可以在BLOCKED线程上调用就好了,
我一直在用OpenMP调用这个 在C11 std::threads中(我相信这些只是pthreads) 但是,OpenMP的实现速度是原来的两倍——更快!我本以为C11线程会更快,因为它们更低级。注意:上面的代码在一个循环中不仅被调用了一次,而且可能被调用了10000次,所以这可能与此有关吗? 编辑:为了澄清,在实践中,我要么使用OpenMP,要么使用C 11版本——不是两者都使用。当我使用Ope
如何启动线程: 我调用关闭线程:
我们在其中一个模块中使用了Hystrix-断路器模式[library]。usecase是:-我们正在从kafka轮询16个消息,并使用pararllel流处理它们,因此,对于工作流中的每条消息,它需要3个rest调用,这些调用由hystric命令保护。现在,问题是当我尝试运行单个实例时,CPU显示尖峰,线程转储显示许多线程处于等待状态,等待所有3个命令。如下所示:-