我只是在Java中启动线程基础知识.synced关键字告诉调度程序在线程执行过程中不要进行上下文切换。另外,当更多线程尝试访问同一资源时,就会发生竞争状态。考虑到这一点,我创建了一个简单的类来向我自己演示这个概念。
public class DemoThread{
int i = 1;
public void runThreads() {
Thread t1 = new Thread(new Runnable () {
@Override
public void run() {
synchronized(this) {
i++;
System.out.println("Thread 1: " + i);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(this) {
i--;
System.out.println("Thread 2: " + i);
}
}
});
for (int k = 0; k <=100; k++) {
t1.start();
t2.start();
}
}
}
我只是在底部有一个forloop来执行这些线程100次。但是,我在控制台中收到此错误:
Thread 2: 1Exception in thread "main"
Thread 1: 1
java.lang.IllegalThreadStateException
at java.base/java.lang.Thread.start(Thread.java:795)
at thread_demo.DemoThread.runThreads(DemoThread.java:31)
at thread_demo.main.main(main.java:9)
那是为什么?
答案 0 :(得分:2)
start()
类中的Thread
方法具有以下几行:
if (threadStatus != 0)
throw new IllegalThreadStateException();
threadStatus
用于表示给定Thread
的状态。如果为0,则表示Thread
尚未启动。上面的代码意味着,如果您尝试在已经运行的start()
上调用Thread
,则会抛出IllegalThreadStateException
。
发生特定错误的原因是,对于给定线程start()
和t1
,您多次调用t2
方法
答案 1 :(得分:2)
此代码:
for (int k = 0; k <=100; k++) {
t1.start();
t2.start();
}
多次启动t1
和t2
。这是禁止的。
答案 2 :(得分:1)
您不能多次启动同一线程。
Example