关于主线程等待法的两个问题。
来源: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.这样理解是正确的
032023-11-18
相似问题