我有这个问题:
创建并运行一个在屏幕上写“Hello friends”的线程。主线程等待它只有500毫秒。然后在为创建的Thread提供比主线程更低的优先级后再次运行程序。这一次,主线程应该等待10毫秒。你注意到了吗?为什么?
我想知道Thread.setPriority(n)
所带来的差异
第一个代码和第二个获得相同的输出
第一个代码
public class Q2 {
public static void main(String[] args) {
Thread2 myThread = new Thread2();
myThread.start();
System.out.println("main thread");
}
}
class Thread2 extends Thread{
@Override
public void run(){
try {
join(500);
System.out.println("Hello Friends from thread2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
借调代码
public class Q2 {
public static void main(String[] args) {
Thread2 myThread = new Thread2();
myThread.start();
System.out.println("main thread");
}
}
class Thread2 extends Thread{
@Override
public void run(){
try {
setPriority(MIN_PRIORITY);
join(500);
System.out.println("Hello Friends from thread2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
主线程应该等待10毫秒
这不是你的代码所做的。 join
应该在主线程中,而不是在新创建的线程中:
Thread2 myThread = new Thread2();
myThread.start();
myThread.join(10);
我假设这个练习的整个想法是看两个具有不同优先级的线程之间的区别。为线程赋予较低优先级可能会延迟其计划执行。当主线程等待新线程完成的持续时间较短时,两个线程的输出可能会交错,因为主线程可能会在第二个线程之前继续到达System.out
。
Thread
类的文档解释了线程的优先级:
每个帖子都有优先权。优先级较高的线程优先于优先级较低的线程执行。
答案 1 :(得分:1)
一般来说,不要延长Thread
,而应该换一个Runnable
。
线程优先级是
它唯一的区别就是当你的机器非常繁忙时,从睡眠中醒来需要更长的时间。例如<{1}}而不是说500到501毫秒,有时可能需要510毫秒。
我该如何使用join方法?
join
的目的是等待另一个线程完成一些时间限制。如果您自己加入,这实际上与join
相同,我建议使用Thread.sleep
,因为这不会让您感到困惑。
答案 2 :(得分:1)
首先,来自Thread
的文档:
此线程最多等待毫秒毫秒。超时为0意味着永远等待。
所以当你有两个Thread
实例时,让我们说当前的实例和一个新的实例,你可以让当前的线程等待新的实例死掉:
final Thread t = new Thread(() -> System.out.println("Test"));
t.start();
t.join();
所以现在我们当前的线程(创建t
的线程)将等待t
死亡,然后继续。此方法使异步任务同步。
现在,在join
中调用Thread
会怎么做?好吧,这意味着线程将等待本身死亡。这与TimeUnit.MILLISECONDS.sleep()
相同。
那么您的代码实际上做了什么?
好吧,main
调用以下代码:
Thread2 myThread = new Thread2();
myThread.start();
System.out.println("main thread");
这里没有任何内容让main
等待任何事情,main
就会死亡。
现在,Thread2
(class
的可怕的名称)执行以下操作:
setPriority(MIN_PRIORITY);
join(500);
System.out.println("Hello Friends from thread2");
因此它设置了自己的优先级,然后等待500
毫秒自身死亡。显然它不会在那个时候死去。然后打印。
setPriority
在此代码中几乎没有任何内容还有一点需要注意,请extends Thread
使用Runnable
。