run调用其他函数中不会切换到其他线程

run调用其他函数中不会切换到其他线程

问题描述:

如果Thread.sleep()写在Weather类中,会出现输出生成温度后等待较长时间,之后快速输出读取温度和生成温度。这是不是说明,run函数调用其他函数过程中不会切换到其他线程

相关代码:


package thread;

import java.util.Random;

public class Weather {
public int temperature;
public int humidity;
public boolean flag = false;

public synchronized void set() {
if(flag){
try {

wait();
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
}
Random r = new Random();
temperature = r.nextInt(41);
humidity = r.nextInt(41);
System.out.println("生成温度:" + temperature + ",湿度:" + humidity);
flag = true;
notifyAll();

}

public synchronized void get() {
if(!flag){
try {

wait();
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
}
System.out.println("读取温度:" + temperature + ",湿度:" + humidity);
flag = false;
notifyAll();

}
}


package thread;

public class ReadWeather implements Runnable{
public Weather e;
ReadWeather(Weather e){
this.e = e;
}

@Override
public void run() {
int i = 0;
while(i++<100){

e.get();
try {
Thread.sleep(100);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
}

}
}
package thread;

public class GenerateWeather implements Runnable{
public Weather e;
GenerateWeather(Weather e){
this.e = e;
}

@Override
public void run() {
int i = 0;
while(i++<100){

e.set();
try {
Thread.sleep(1000);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
}

}
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,并不是run调用就保证部切换线程了,而是在代码中调用wait()方法使线程处于等待状态,当调用notifyAll()唤醒线程时,才可以继续执行。并在代码中使用了synchronized关键字,synchronized可以保证同一时刻只有一个线程可以执行某个方法(对象)。从而使线程在执行时,不来回切换。

祝学习愉快!

  • 慕运维9261880 提问者 #1

    请问,如果run中循环调用加了synchronized关键字的函数,即使调用结束也不会切换线程,但是在循环中加上sleep就可以切换线程了,这是什么原因呢?

    package thread;

    public class test1 {
    int i = 0;
    int j = 0;
    boolean flag = false;

    public synchronized void get1() {
    System.out.println("1:" + ++i);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    // System.out.println("get1 before wait");
    // if(flag) {
    // try {
    // wait();
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    // }
    // System.out.println("get1 after wait");
    // flag = true;
    // notifyAll();
    // try {
    // Thread.sleep(5000);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    }

    public synchronized void get2() {
    System.out.println("2:" + ++j);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }


    // System.out.println("get2 before wait");
    // if(!flag) {
    // try {
    // wait();
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    // }
    // System.out.println("get2 after wait");
    // flag = false;
    // notifyAll();
    // try {
    // Thread.sleep(100);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    }

    }
    package thread;

    public class test1thread implements Runnable{
    test1 t1;
    test1thread(test1 t1){
    this.t1=t1;
    }
    @Override
    public void run() {
    while(true){
    t1.get1();
    // try {
    // Thread.sleep(1000);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    }
    }
    }
    package thread;

    public class test1thread2 implements Runnable{
    test1 t1;
    test1thread2(test1 t1){
    this.t1=t1;
    }
    @Override
    public void run() {
    while(true){
    t1.get2();
    // try {
    // Thread.sleep(1000);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
    }
    }
    }


    2021-04-03 15:24:08
  • 慕运维9261880 提问者 #2

    会切换线程,自己想错了?​  谢谢啦

    2021-04-03 15:33:33
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师