请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于主线程等待法的两个问题。

我是小白,还有点晕乎乎的,希望老师指导,感谢

(1) 疑问:
currentThread() 的问题,看了评论区的问题也没看懂。
貌似在这个代码里用Thread.sleep() 和 Thread.currentThread().sleep() 产生的结果是一样的?是为什么呢?
代码中第一个Thread.sleep() ,控制的是那个我们实现runnable的线程t。
第二个Thread.sleep(),控制的是main方法。我还想问一下,怎么知道Thead是哪一个线程呢?为什么这个时候是Main方法,而不是t,程序是如何判断的?

(2) 理解是否正确?
我加了打印name的代码,
public class CycleWait implements Runnable{
private String value;
@Override
public void run() {
try {
Thread.sleep(5000);
//新增打印语句
System.out.println("run name : " + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
value = “we have data now”;
}

public static void main(String[] args) throws InterruptedException {
    CycleWait cw = new CycleWait();
    Thread t = new Thread(cw);
    t.start();
    while (cw.value == null) {
        Thread.sleep(100);
        // 新增打印语句
        System.out.println("while name : " + Thread.currentThread().getName());
    }

// t.join();
System.out.println("value : " + cw.value);
}
}

后输出如下
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
while name : main
run name : Thread-0
while name : main
value : we have data now

我对这个输出的理解是,
(1)主线程通过轮询等待子线程的value不为null,所以前面一直打印while name : main
(2)t线程sleep5s后,开始run了,打印run name : Thread-0,还没执行到value = “we have data now”;main方法还在继续轮询,所以打印while name : main
(3)得到value后,打印value : we have data now

正在回答 回答被采纳积分+3

1回答

翔仔 2023-11-12 13:53:43

同学好,

1.Thread.Sleep() 和Thread.currentThread().Sleep() 结果是一样的,方法都是针对当前执行的线程。因为Sleep不是一个线程针对另一个线程执行的操作,所以Thread.Sleep()在这里对调用方来说只是指调用函数的线程,是一个特殊的实例。所以Thread.currentThread().getName()就可以知道当前是main 还是t

2.这样理解是正确的

0 回复 有任何疑惑可以回复我~
  • 谢谢老师的回复,Thread.currentThread().getName()就可以知道当前是main,这个我打印到终端了,确实是main,但是我不理解为什么在main函数里,t线程也是启动的,为什么用Thread.currentThread().getName()获得的就是main,不是t呢?在main函数里不是同时存在main线程和t线程吗?
    回复 有任何疑惑可以回复我~ 2023-11-13 19:31:46
  • 翔仔 回复 提问者 weixin_慕函数6469244 #2
    同学好,因为这是main函数的代码,执行的时候肯定是main线程执行呀。
    回复 有任何疑惑可以回复我~ 2023-11-17 22:40:22
  • 提问者 weixin_慕函数6469244 回复 翔仔 #3
    我懂了,Thread.getName()指的是当前函数的线程,谢谢翔仔!
    回复 有任何疑惑可以回复我~ 2023-11-18 10:26:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信