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()的线程正在等待指定的线程终止-----------------