如何设置java.util.Timer的优先级

时间:2013-09-11 11:19:58

标签: java

如何在java中设置Timer的Thread优先级?这是我在我正在开发的项目中找到的代码,我认为它不起作用:

public static Timer createNamedTimer(boolean isDaemon,
            final String threadName, final int priority) {
        Timer timer = new Timer(isDaemon);
        timer.schedule(new TimerTask() {
            public void run() {
                Thread.currentThread().setName("TimerThread: " + threadName);
                Thread.currentThread().setPriority(priority);
            }
        }, 0);
        return timer;
    }

2 个答案:

答案 0 :(得分:2)

AFAIK for timer是你改变优先级的唯一方法就是你这样做。

如果您需要更好的选项,可以使用ThreadFactory创建线程并设置其优先级。

class SimpleThreadFactory implements ThreadFactory {
    private int threadPriority;
    public Thread newThread(Runnable r) {
     Thread t = new Thread(r);
     t.setPriority(threadPriority);
     return t;
   }
 }

然后你可以将工厂传递到Java的Executors框架来做你想做的事,恕我直言这将是一个更好的方法。

为什么我说这是一种更好的方法?

Timer类的JavaDoc提及ScheduledThreadPoolExecutor并注意到,此类实际上是Timer/TimerTask组合的更通用的替换

答案 1 :(得分:0)

建议的解决方案不太可能适用于重复多次的任务,因为在调用之间,共享同一线程的另一个任务可能已将优先级调整为其他任务。因此,对于重复任务,您必须每次都在执行时设置优先级。这个潜在的问题与新的FS框架无关或存在。

一种解决方案是创建一个包装类,为您准备工作以确保一致性。例如:

<强> AnyClass.java:

Executors

<强> Task.java:

private static void exampleUsage()
{
   try { launchHighPriorityTask(() -> System.out.println("What a fancy task.")).join(); }
   catch (Throwable ignored) {}
}

private static Thread launchMaxPriorityTask(Runnable task)
{
  final Thread customThread = new Thread(new Task("MaxPriority", Thread.MAX_PRIORITY, task));
  customThread.start();
  return customThread;
}

这自然是这种设置可以实现的极简主义的例子。