1

javaでタイマーのスレッド優先度を設定するには? これは、私が取り組んでいるプロジェクトで見つけたコードであり、機能しているとは思いません。

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;
    }
4

2 に答える 2

1

提案された解決策は、複数回繰り返されるタスクでは機能しない可能性があります。これは、呼び出しの間に、同じスレッドを共有する別のタスクが優先度を別のものに調整している可能性があるためです。したがって、タスクを繰り返す場合は、毎回、実行時に優先度を設定する必要があります。この潜在的な問題は、新しいExecutorsフレームワークがなくても存在します。

1 つの解決策は、一貫性を確保するための準備作業を行うラッパー クラスを作成することです。例えば:

AnyClass.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;
}

Task.java:

public class Task implements Runnable
{
   private final String name;
   private final int priority;
   private final Runnable task;

   public Task(String name, int priority, Runnable task)
   {
      if (null == task) throw new NullPointerException("no task provided");
      this.name = name; this.priority = priority; this.task = task;
   }

   /**
    * run() is made final here to prevent any deriving classes 
    * accidentally ruining the expected behavior
    */
   @Override public final void run()
   {
      final Thread thread = Thread.currentThread();

      // cache the current state to restore settings and be polite
      final String prevName = thread.getName();
      final int prevPriority = thread.getPriority();

      // set our thread's config
      thread.setName(name);
      thread.setPriority(priority);

      try { task.run(); } catch (Throwable ignored) {}

      // restore previous thread config
      thread.setPriority(prevPriority);
      thread.setName(prevName);
   }
}

これは当然、この種のセットアップで達成できることの最小限の例です。

于 2016-03-21T21:57:50.937 に答える