0

次のように初期化された Java ThreadPool があります。

ThreadFactory tFactory = new DatabaseWorkerThreadFactory();
final ExecutorService dbService = new ThreadPoolExecutor(1, 5, 10L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tFactory);

次に、このようにそのスレッドプールで Runnable Task を実行します

executorService.execute(new RunnableDbInsertTask(netData));

これらの挿入を残りのコードから非同期にするため。

ActiveJDBC を ActiveRecord 実装として使用しているため、各ワーカーにアクティブな Connection が必要です。これには、RunnableDbInsertTaskrun()メソッドの開始時にこのコードを使用します。

if(!Base.hasConnection())
        Base.open(params);

したがって、ThreadPoolExecutorが使用されると、タスクを取得する新しくスポーンされたそれぞれThreadが一意の接続を持ち、すべての接続でそれを再利用します。

ThreadPoolExecutor's実行するジョブがない場合 、コンストラクターで指定されているように、スレッド量を最小値 (1) にフォールバックする必要があります。

これが正しく行われるためには、アクティブでないためにスレッドが自動的に終了するときに、ThreadPoolExecutorActiveJDBC のBase.close()メソッドを呼び出す接続を自動終了する必要があります。

解決策として、メソッドをオーバーライドしようとDatabaseWorker.interrupt()しましたが、うまくいきませんでした。

どんな助けでも感謝します。ありがとう!

4

1 に答える 1