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

来源:8-4 如何实现处理线程的返回值

weixin_慕函数6469244

2023-11-10

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

(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

写回答

1回答

翔仔

2023-11-12

同学好,

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

2.这样理解是正确的

0
3
weixin_慕函数6469244
回复
翔仔
我懂了,Thread.getName()指的是当前函数的线程,谢谢翔仔!
2023-11-18
共3条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程