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

时间:2016-04-02 10:27:54

标签: java multithreading

我有这个问题:

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

3 个答案:

答案 0 :(得分:1)

  

主线程应该等待10毫秒

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

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

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

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

  

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

答案 1 :(得分:1)

一般来说,不要延长Thread,而应该换一个Runnable

线程优先级是

  • 只是提示,如果您没有合适的权限,操作系统可以并且确实会忽略它。
  • 只有你没有免费的CPU才有意义。如果你有空闲的CPU,每个想要运行的线程都可以运行。
  • 如果你让你的线程进入睡眠状态真的不重要。例如加入。

它唯一的区别就是当你的机器非常繁忙时,从睡眠中醒来需要更长的时间。例如<{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就会死亡。

现在,Thread2class可怕的名称)执行以下操作:

setPriority(MIN_PRIORITY);
join(500);
System.out.println("Hello Friends from thread2");

因此它设置了自己的优先级,然后等待500毫秒自身死亡。显然它不会在那个时候死去。然后打印。

TL; DR:setPriority在此代码中几乎没有任何内容

还有一点需要注意,请extends Thread使用Runnable