当前位置: 首页 > 知识库问答 >
问题:

为什么ocketRead0使线程处于RUNNABLE状态

戚飞虎
2023-03-14

我已经用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)

共有1个答案

宗政文彬
2023-03-14

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个命令。如下所示:-