Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例化新字符时线程处于[等待]状态_Java_Multithreading - Fatal编程技术网

Java 实例化新字符时线程处于[等待]状态

Java 实例化新字符时线程处于[等待]状态,java,multithreading,Java,Multithreading,我最近偶然发现了一个无法解释的错误: 线程处于[WAITING]状态,同时似乎正在执行char buf[]=new char[count+otherLen]内部java.lang.String.concat(String.java:2021) 这是stacktrace: "WORKER3"/[WAITING] java.lang.String.concat(String.java:2021) java.net.URLClassLoader$1.run(URLClassLoader

我最近偶然发现了一个无法解释的错误:

线程处于
[WAITING]
状态,同时似乎正在执行
char buf[]=new char[count+otherLen]内部
java.lang.String.concat(String.java:2021)

这是stacktrace:

"WORKER3"/[WAITING]
    java.lang.String.concat(String.java:2021)
    java.net.URLClassLoader$1.run(URLClassLoader.java:357)
    java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    java.security.AccessController.doPrivileged(Native Method)
    java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    java.lang.Class.forName0(Native Method)
    java.lang.Class.forName(Class.java:186)
    [...]
现在,从文档中我们可以看到处于
等待
状态的线程是:

等待线程的线程状态。线程处于等待状态 由于调用以下方法之一:

Object.wait with no timeout   
Thread.join with no timeout   
LockSupport.park
但是
String.concat
的源代码似乎没有使用以下内容:

 2016       public String concat(String str) {
 2017           int otherLen = str.length();
 2018           if (otherLen == 0) {
 2019               return this;
 2020           }
 2021           char buf[] = new char[count + otherLen];
 2022           getChars(0, count, buf, 0);
 2023           str.getChars(0, otherLen, buf, count);
 2024           return new String(0, count + otherLen, buf);
 2025       }
我有一种感觉,这可能与垃圾收集有关,但我找不到任何证据证明这种相关性


有人能解释一下吗?

线程堆栈不应该只在一个实例中观察到。如果一个线程在等待某个资源相当长的一段时间,那么应该收集并分析线程转储的多个快照。或者存在死锁,线程只在一个时间点等待是正常的。@Timothy你是说OpenJDK中的文档是错误的吗?如果是这样的话,还有什么情况可能会有线程在等待呢?@snovelli:一点也不,不,我并不是说doc是错的。我说过线程可以在一个时间点等待,但这并不意味着这是一个问题。从docs------------处于等待状态的线程正在等待另一个线程执行特定操作。例如,在对象上调用Object.wait()的线程正在等待另一个线程调用该对象上的Object.notify()或Object.notifyAll()。调用thread.join()的线程正在等待指定的线程终止-----------------