繁体   English   中英

设置主线程的优先级有什么区别?

[英]What is the difference between setting the priority for the main thread or not?

我有这个问题:

创建并运行一个在屏幕上写“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();
        }
    }
}

主线程应该等待10毫秒

这不是你的代码所做的。 join应该在主线程中,而不是在新创建的线程中:

Thread2 myThread = new Thread2();
myThread.start();
myThread.join(10);

我假设这个练习的整个想法是看到两个具有不同优先级的线程之间的区别。 为线程赋予较低优先级可能会延迟其计划执行。 当主线程等待新线程完成的较小持续时间时,两个线程的输出可以交错,因为主线程可以在第二线程之前继续到达System.out

Thread类的文档解释了线程优先级是什么:

每个线程都有优先权。 具有较高优先级的线程优先于具有较低优先级的线程执行。

一般来说,不要扩展Thread ,你应该换一个Runnable

线程优先级是

  • 只是一个提示,如果您没有正确的权限,操作系统可以并且确实会忽略它。
  • 只有你没有空闲的CPU才有意义。 如果你有空闲的CPU,每个想要运行的线程都可以运行。
  • 如果你让你的线程睡觉真的没关系。 例如一个加入。

它唯一的区别就是当你的机器非常繁忙时,从睡眠中醒来需要更长的时间。 例如,有时不需要说500到501毫秒进行join ,有时可能需要510毫秒。

我该如何使用join方法?

的目的join是等待另一个线程来完成了一些时间限制。 如果您自己加入,这实际上与Thread.sleep相同我建议使用Thread.sleep因为这不会Thread.sleep感到困惑。

首先,从Thread的文档:

此线程最多等待毫秒毫秒。 超时为0意味着永远等待。

所以当你有两个Thread实例时,让我们说当前的一个和一个新实例,你可以让当前的线程等待新的实例死掉:

final Thread t = new Thread(() -> System.out.println("Test"));
t.start();
t.join();

所以现在我们当前的线程(创建t那个)将等待t死亡,然后继续。 此方法使异步任务同步

现在,调用Thread join 什么作用? 嗯,这意味着线程将等待自己死亡。 这与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毫秒自己死亡。 显然它不会在那个时候死去。 然后打印。

TL; DR: setPriority在此代码中setPriority没有


还要注意,不要extends Thread ,使用Runnable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM