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

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>


正在回答

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

1回答

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

祝学习愉快!

  • 慕运维9261880 提问者 #1

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

    1
    package thread;<br><br>public class test1 {<br>    int i = 0;<br>    int j = 0;<br>    boolean flag = false;<br><br>    public synchronized void get1() {<br>        System.out.println("1:" + ++i);<br>        try {<br>            Thread.sleep(1000);<br>        } catch (InterruptedException e) {<br>            e.printStackTrace();<br>        }<br>//        System.out.println("get1 before wait");<br>//        if(flag) {<br>//            try {<br>//                wait();<br>//            } catch (InterruptedException e) {<br>//                e.printStackTrace();<br>//            }<br>//        }<br>//        System.out.println("get1 after wait");<br>//        flag = true;<br>//        notifyAll();<br>//        try {<br>//            Thread.sleep(5000);<br>//        } catch (InterruptedException e) {<br>//            e.printStackTrace();<br>//        }<br>    }<br><br>    public synchronized void get2() {<br>        System.out.println("2:" + ++j);<br>        try {<br>            Thread.sleep(1000);<br>        } catch (InterruptedException e) {<br>            e.printStackTrace();<br>        }<br><br><br>//        System.out.println("get2 before wait");<br>//        if(!flag) {<br>//            try {<br>//                wait();<br>//            } catch (InterruptedException e) {<br>//                e.printStackTrace();<br>//            }<br>//        }<br>//        System.out.println("get2 after wait");<br>//        flag = false;<br>//        notifyAll();<br>//        try {<br>//            Thread.sleep(100);<br>//        } catch (InterruptedException e) {<br>//            e.printStackTrace();<br>//        }<br>    }<br><br>}<br>
    1
    package thread;<br><br>public class test1thread implements Runnable{<br>    test1 t1;<br>    test1thread(test1 t1){<br>        this.t1=t1;<br>    }<br>    @Override<br>    public void run() {<br>        while(true){<br>            t1.get1();<br>//            try {<br>//                Thread.sleep(1000);<br>//            } catch (InterruptedException e) {<br>//                e.printStackTrace();<br>//            }<br>        }<br>    }<br>}<br>
    1
    package thread;<br><br>public class test1thread2 implements Runnable{<br>    test1 t1;<br>    test1thread2(test1 t1){<br>        this.t1=t1;<br>    }<br>    @Override<br>    public void run() {<br>        while(true){<br>            t1.get2();<br>//            try {<br>//                Thread.sleep(1000);<br>//            } catch (InterruptedException e) {<br>//                e.printStackTrace();<br>//            }<br>        }<br>    }<br>}<br>


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

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

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

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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