0

ThreadPoolExecutor クラスを使用すると、カスタム ThreadFactory を指定して新しいスレッドを作成できます。ただし、Sun の ThreadPoolExecutor の実装内でこれらのスレッドがどのように使用されるかはわかりません。

この実装は、次のように新しいスレッドを作成します。

private Thread addThread(Runnable firstTask) {
    Worker w = new Worker(firstTask);
    Thread t = threadFactory.newThread(w);
    if (t != null) {
        w.thread = t;
    ...
    } ...

しかし、ワーカーの実装では、フィールド「スレッド」がランナーとしてどのように使用されているかわかりません。

さらに、再利用されるカスタムの「実行」メソッドをスレッドに提供する方法がわかりません(再利用される場合-ThreadPoolExecutorのように-「複数のRunnableを実行する」ことを意味します)。ThreadPoolExecutor がそのようなスレッドを再利用して複数の Runnable を実行するにはどうすればよいですか (クラス Thread の「ターゲット」Runnable が構築時に設定され、セッターがない場合)。ThreadPoolExecutor のドキュメントは次のとおりです。

 By supplying a different ThreadFactory, you can alter the thread's name, thread group, priority, daemon status, etc.

これは、カスタム ThreadFactory によって作成されたスレッドの「run」メソッドが使用されないということですか? それが、「カスタムスレッドの作成 + スレッドの「再利用」」メカニズムを理解する唯一の方法です。

4

2 に答える 2

4

しかし、Workerの実装では、フィールド「スレッド」がランナーとしてどのように使用されているかわかりません。

newThread()のドキュメントに記載されているように、新しく作成されたスレッドは、threadFactory.newThread(Runnuble)の引数として指定されたRunnubleを実行する必要があります。これは、新しいスレッドがランナーとして使用される方法です。

さらに、再利用されるカスタムの「実行」メソッドをスレッドに提供する方法がわかりません。

この場合も、スレッドのrunメソッドは、提供されたRunnable.run()を1回実行する必要があります。スレッドポーリングは、ループでタスクを実行するワーカーを提供します。正しいユーザー実装スレッドの例:

public class ThreadTL extends Thread {
    public ThreadTL(Runnable r) {
        super(r);
        setName(getName()+" DF "+executor.getClass().getSimpleName());
    }

    @Override
    public void run() {
        super.run();
    }
}
于 2012-03-27T07:13:00.637 に答える
1

1つのRunnableが別のRunnableを呼び出すことができます。渡されるRunnableは、スレッドプールキューからRunnableを取得し、それらを実行するものです。

于 2012-03-27T07:14:13.730 に答える