Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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

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,虽然我的问题听起来很愚蠢 以下是多线程的代码: 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();