run调用其他函数中不会切换到其他线程
问题描述:
如果Thread.sleep()写在Weather类中,会出现输出生成温度后等待较长时间,之后快速输出读取温度和生成温度。这是不是说明,run函数调用其他函数过程中不会切换到其他线程
相关代码:
1 | <br> package thread;<br><br> import java.util.Random;<br><br> public class Weather {<br> public int temperature;<br> public int humidity;<br> public boolean flag = false ;<br><br> public synchronized void set() {<br> if (flag){<br> try {<br><br> wait();<br> } catch (InterruptedException interruptedException) {<br> interruptedException.printStackTrace();<br> }<br> }<br> Random r = new Random();<br> temperature = r.nextInt( 41 );<br> humidity = r.nextInt( 41 );<br> System.out.println( "生成温度:" + temperature + ",湿度:" + humidity);<br> flag = true ;<br> notifyAll();<br><br> }<br><br> public synchronized void get() {<br> if (!flag){<br> try {<br><br> wait();<br> } catch (InterruptedException interruptedException) {<br> interruptedException.printStackTrace();<br> }<br> }<br> System.out.println( "读取温度:" + temperature + ",湿度:" + humidity);<br> flag = false ;<br> notifyAll();<br><br> }<br>} |
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();
}
}
}
}
1 | package thread;<br><br> public class GenerateWeather implements Runnable{<br> public Weather e;<br> GenerateWeather(Weather e){<br> this .e = e;<br> }<br><br> @Override <br> public void run() {<br> int i = 0 ;<br> while (i++< 100 ){<br><br> e.set();<br> try {<br> Thread.sleep( 1000 );<br> } catch (InterruptedException interruptedException) {<br> interruptedException.printStackTrace();<br> }<br> }<br><br> }<br>}<br> |
16
收起
正在回答
1回答
同学你好,并不是run调用就保证部切换线程了,而是在代码中调用wait()方法使线程处于等待状态,当调用notifyAll()唤醒线程时,才可以继续执行。并在代码中使用了synchronized关键字,synchronized可以保证同一时刻只有一个线程可以执行某个方法(对象)。从而使线程在执行时,不来回切换。
祝学习愉快!
java工程师2020版
- 参与学习 人
- 提交作业 9404 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧