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();
}
}
}
}
16
收起
正在回答
1回答
同学你好,并不是run调用就保证部切换线程了,而是在代码中调用wait()方法使线程处于等待状态,当调用notifyAll()唤醒线程时,才可以继续执行。并在代码中使用了synchronized关键字,synchronized可以保证同一时刻只有一个线程可以执行某个方法(对象)。从而使线程在执行时,不来回切换。
祝学习愉快!
java工程师2020版
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星