1

私は何かについて理解しようとしています-以下に述べられている方法は、言及されてnewSingleThreadExecutorいない場合にタスクを順次実行します。ThreadFactory

public static ExecutorService newSingleThreadExecutor()

無制限のキューで動作する単一のワーカー スレッドを使用する Executor を作成します。(ただし、シャットダウン前の実行中に障害が発生してこの単一のスレッドが終了した場合、後続のタスクを実行するために必要に応じて新しいスレッドが代わりに使用されることに注意してください。) タスクは順次実行されることが保証されており、複数のタスクがアクティブになることはありません。いつでも。それ以外の同等のものとは異なり、newFixedThreadPool(1)返されたエグゼキューターは、追加のスレッドを使用するために再構成できないことが保証されています。

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)

無制限のキューで動作する単一のワーカー スレッドを使用する Executor を作成し、必要に応じて提供された ThreadFactory を使用して新しいスレッドを作成します。それ以外の同等のものとは異なり、newFixedThreadPool(1, threadFactory)返されたエグゼキューターは、追加のスレッドを使用するために再構成できないことが保証されています。

パラメーター:

しかし、以下の例を考えると、私は ThreadFactory を使用しています:

executor = Executors.newSingleThreadExecutor(getPrioritisedFactory());
`private ThreadFactory getPrioritisedFactory() {
    ThreadFactory prioritisedFactory = new ThreadFactory() {
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r, recSocketServerThreadID);
            t.setPriority(Thread.MAX_PRIORITY);
            return t;
        }
    };
    return prioritisedFactory;
}`

シーケンシャルを尊重していないようです。スレッドの優先度が同じで、ランダムに選択し始めているためですか? ファクトリを使用しているときに発生した場合、Java ヘルプからは明確ではありません。

ありがとう。


今まで得た答えをありがとう。これがより多くのコードと説明です。高負荷状態 (1000 件のスレッドが送信された) のログで発見したことは、最初に送信されたスレッドが、他のスレッドが後で送信された後に開始されたことです。

この例は簡略化されていますが、MyThread.run メソッドには、ロギングを遅らせるコードはありません。

  • 1:00:01.100 DEB 新しいスレッド[id:500]
  • 1:02:01.160 DEB 新しいスレッド[id:900]
  • 1:03:01.200 WAR 開始スレッド [thID:900]
  • 1:04:02.200 WAR 開始スレッド [thID:500]
private ExecutorService executor;


 executor = Executors.newSingleThreadExecutor(getPrioritisedFactory());
 ....
 //Keep adding threads here
 MyThread mine=MyThread();
 System.out.println(String.format("new thread[id:%d]",
                        mine.getId()));
 executor.execute(mine);



 public class MyThread extends Thread 
 {

   @Override
    public void run() {
        long startTimeMillis = System.currentTimeMillis();
        long currentTimeMillis = System.currentTimeMillis();
        long delayMillis = currentTimeMillis - this.createTimeMillis;
        logger.warn(String.format("Started  thread [thID:%d]",
                   this.getId()));
       ........
    }

 }
4

2 に答える 2