0

次のようにThreadクラスを拡張するクラスがあります。

public class RemoteDataSynchTaskProcessor extends Thread {
private GDRType taskGDR;

public RemoteDataSynchTaskProcessor(GDRType taskGDR) {
    this.taskGDR = taskGDR;
}

private void execute() {

    try {
        try {

            RemoteClient.runDataSynchTask(taskGDR);

        } catch (RemoteException re) {
            //.....
        } catch (NotBoundException e) {
            //......
        }
        processResult(false, "Success");
    } catch (DTSException de) {
    //....
    }

}

public void run() {
    Observer.incrementNumOfDataSyncyProcessor();

    try {
        execute();
    } finally {
        Observer.decrementNumOfDataSynchProcessor();
    }
}

このスレッドの実行が終了すると、次の名前の別のスレッドが表示されます。スレッド[pool-34-thread-1](実行中)

なぜこのスレッドが表示されて終了しないのかわかりません。数日後には数千のスレッドが発生し、プール数は毎回増加します(例:スレッド[pool-2500-thread-1])

これらの生成されたスレッドの実行をデバッグおよび一時停止する場合、スタックは次のようになります。

Thread [pool-1-thread-1] (Suspended)    
Unsafe.park(boolean, long) line: not available [native method]  
LockSupport.park(Object) line: 156  
AbstractQueuedSynchronizer$ConditionObject.await() line: 1987   
LinkedBlockingQueue<E>.take() line: 399 
ThreadPoolExecutor.getTask() line: 947  
ThreadPoolExecutor$Worker.run() line: 907   
Thread.run() line: 662  

これらのスレッドは何ですか、どうすればそれらを取り除くことができますか?

編集:それは私が使用しているクローズドソースのスレッドプールライブラリと関係があるようです(エグゼキュータサービスについて尋ねるコメントから判断して)。

ThreadPool機能を提供するライブラリを使用しています。これは、アプリケーションの起動時にプールを作成する方法です。

    ThreadPool fetcherPool = new ThreadPool("TASK_FETCHER", ConfigParams.minimumTaskFetcherCount, ConfigParams.maximumTaskFetcherCount, new TaskFetcher());

ThreadPool.javaはJavaのThreadGroupクラスを拡張しているようで、ThreadFetcherは次のとおりであり、実際にスレッドをトリガーします。

public class TaskFetcher extends PooledMessageWorker //Pooled Message Worker extends ReacreatableThread

public void run() {
    Observer.incrementNumOfTaskFetcher();
    try {
        while (true) {
            try {
                if (Observer.isShutdowned()) {
                    break;
                }
                ControllerUtil.getInstance().waitIfPaused();

                ESDRType task = (ESDRType) TaskHandler.getTask();
                if (task != null) {
                    trigger(task);
                }
            } catch (Exception e) {
                LogUtil.error(logger, e.getMessage(), e);
            }
        }
    } finally {
        Observer.decrementNumOfTaskFetcher();
    }
}


private void trigger(ESDRType task) {
    try {
        GDRType[] messages = createMessages(esdr);
    for (GDRType message : messages) {
        RemoteDataSynchTaskProcessor remoteCDCMTaskProcessor = new      RemoteDataSynchTaskProcessor(message);
        remoteCDCMTaskProcessor.start(); //This thread causes a new thread appear after execution finishes
        LogUtil.debug(logger, "[distributeMessage()] [Message: ", message, "]... [OK]");    
    }
    } catch (DTSException exception) {
    // Logging stuff
    }
}

}

4

2 に答える 2

1

クローズドソースのサードパーティのThreadPoolライブラリを使用する必要がある理由はありますか?そうでない場合は、RemoteDataSynchTaskProcessorRunnableBTW、私は常に拡張よりも拡張/実装Runnableを好みますThread)を作成し、それをで使用してみてくださいExecutorService

実際、サードパーティのライブラリを使用する必要がある場合でも、デバッグにはこれを試してみます。問題がどこにあるかを絞り込むことができます。

于 2012-11-26T23:47:09.820 に答える
0

申し訳ありませんが、そのThreadPoolまたはRemoteDataSynchTaskProcessorとは何の関係もないようです。

RemoteDataSynchTaskProcessorのProcessResults()メソッドによって呼び出されるメソッドに別のExecutorServiceが作成されていることに気づきませんでした。また、エグゼキュータサーバーは、ジョブがダウンした後もシャットダウンされません。私の悪い。

したがって、原因不明のthradが発生するこのような問題が発生した場合は、コードを2回チェックしてください:Dどこか別の場所で問題を探してください:P

于 2012-11-27T19:30:44.763 に答える