java线程理解问题
虽然我的问题听起来很愚蠢 以下是多线程的代码:java线程理解问题,java,multithreading,Java,Multithreading,虽然我的问题听起来很愚蠢 以下是多线程的代码: public class Main { private int x = -1; public Main(int xy) { this.setX(xy); } static Main main; public static void main(String[] args) { main = new Main(10); Runnable runnable = new Runnable() { @Over
public class Main {
private int x = -1;
public Main(int xy) {
this.setX(xy);
}
static Main main;
public static void main(String[] args) {
main = new Main(10);
Runnable runnable = new Runnable() {
@Override
public void run() {
synchronized (main) {
System.out.println(Thread.currentThread().getName());
for (int i = 0; i < 5; i++) {
main.setX(main.getX() + 10);
if (main.getX() >= 40) {
try {
wait();
} catch (InterruptedException e) {
}
}
System.out.println("X : " + main.getX());
}
}
}
};
Thread one = new Thread(runnable);
one.setName("Hi From One!!");
one.start();
Thread two = new Thread(runnable);
two.setName("Hi From Two!!");
two.start();
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
公共类主{
私有整数x=-1;
公共干管(int xy){
这是setX(xy);
}
静态主;
公共静态void main(字符串[]args){
干管=新干管(10);
Runnable Runnable=新的Runnable(){
@凌驾
公开募捐{
已同步(主){
System.out.println(Thread.currentThread().getName());
对于(int i=0;i<5;i++){
main.setX(main.getX()+10);
if(main.getX()>=40){
试一试{
等待();
}捕捉(中断异常e){
}
}
System.out.println(“X:+main.getX());
}
}
}
};
线程1=新线程(可运行);
setName(“你好,从一开始!!”);
一、启动();
线程2=新线程(可运行);
setName(“你好,来自两个!!”);
二、启动();
}
公共int getX(){
返回x;
}
公共无效集合x(整数x){
这个.x=x;
}
}
执行此代码时,我得到以下输出:
Hi From Two!!<br>
X : 20<br>
X : 30<br>
Exception in thread "Hi From Two!!" java.lang.IllegalMonitorStateException<br>
at java.lang.Object.wait(Native Method)<br>
at java.lang.Object.wait(Object.java:503)<br>
at Main$1.run(Main.java:23)<br>
at java.lang.Thread.run(Thread.java:722)<br>
Hi From One!!<br>
Exception in thread "Hi From One!!" java.lang.IllegalMonitorStateException<br>
at java.lang.Object.wait(Native Method)<br>
at java.lang.Object.wait(Object.java:503)<br>
at Main$1.run(Main.java:23)<br>
at java.lang.Thread.run(Thread.java:722)<br>
Hi From Two
X:20
X:30
线程“Hi From Two!!”java.lang.IllegalMonitorStateException中出现异常
在java.lang.Object.wait(本机方法)
在java.lang.Object.wait(Object.java:503)
在Main$1.run(Main.java:23)
在java.lang.Thread.run(Thread.java:722)
你好,从一开始
线程“Hi From One!!”java.lang.IllegalMonitorStateException中出现异常
在java.lang.Object.wait(本机方法)
在java.lang.Object.wait(Object.java:503)
在Main$1.run(Main.java:23)
在java.lang.Thread.run(Thread.java:722)
我不明白它为什么抛出非法监视器状态异常
这里我试图实现的是,若X的值大于40,那个么相同的线程应该等待,让其他线程执行
谢谢,
Yash调用
对象。wait
必须在对象上同步
您已调用了runnable.wait
,但已在main
上同步
尝试main.wait()
wait
是一个函数,它要求调用线程在目标上保持监视器
在您的情况下,您正在调用this.wait()
,但不要将监视器保持在this
上
你要么
synchronized (this) {
wait();
}
或
它是从等待中抛出的。您是否查阅过javadoc以查看wait何时抛出这样的异常?
main.wait();