1

私のwhile(true)は一度しか実行されていないので、何が起こっているのかを確認するためにブレークポイントを追加しようとしていますが、私のrun(). IntelliJ を使用しています。デバッガーには「スレッド」タブがあります。ブレークポイントに到達するために適切なスレッドを選択するなど、そのタブで何かをする必要がありますか? スレッド名も表示され、このリストで適切なスレッドを見つける方法を知りたいと思っています。

public class MyClass extends ServerWorkflowProcess<OtherClass> {

    private ExecutorService executorService = Executors.newSingleThreadExecutor();

    ...

    @Override
    public void bootup() {
        logger.info("Booting up: " + this);

        BackgroundProcess backgroundImpositioner = new BackgroundProcess(this.getCollection());
        executorService.submit(backgroundImpositioner);
    }

    @Override
    public void shutdown() {
        executorService.shutdown();
    }
}

バックグラウンド プロセス

public class BackgroundProcess implements Runnable {

    protected volatile Logger logger = Logger.getLogger(BackgroundImpositioner.class.getName());

    Collection<ImpositionWorkstation> impositionWorkstations;

    public BackgroundImpositioner(Collection<ImpositionWorkstation> impositionWorkstation) {
        this.impositionWorkstations = impositionWorkstation;
    }

    public void run() {
        while(true) {
            logger.info("looping");
            for (ImpositionWorkstation workstation : impositionWorkstations) {
                if (workstation.canAcceptWork()) {

                    //go do work in another thread so we're not blocking this
                    workstation.getWorkFromQueue();
                    try {
                        workstation.doWork();
                    } catch (ImpositionException e) {
                        logger.severe(e.getMessage());
                    }
                }
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                logger.severe("Background impositioner was interrupted");
            }
        }
    }
}

補足: コンソールには「ループ」が表示されるため、一度実行されることがわかります。ブレークポイントがヒットすることはなく、複数回実行されることもありません。

4

5 に答える 5

0

私以外の理由で、while(true)行にブレークポイントを設定することはできませんでしたが、run().

于 2013-10-01T19:17:52.833 に答える
0

例外を静かにすり抜けさせないでください。メソッドFutureによって返されたを使用します。submit

Future<?> f=executorService.submit(backgroundImpositioner);
try {
  f.get();
} catch(Exception ex) {
  ex.printStackTrace();
}

それからあなたはもっと知っています。

上記のコードは、実際の問題を見つけるためのものです。本番環境では、完了を待つのではなく、例外が発生したときにログに記録します。たとえば、次のようになります。

executorService.execute(new FutureTask<Object>(backgroundImpositioner, null)
{
  @Override
  protected void done() {
    if(!isCancelled()) try {
      get();
    } catch(InterruptedException ex) {
      throw new AssertionError("on completed task", ex);
    } catch(ExecutionException ex) {
      logger.log(Level.SEVERE, "in background task", ex.getCause());
    }
  }
});
于 2013-10-01T16:09:46.790 に答える
0

run メソッド内で例外がスローされない場合、呼び出しの 1 つが返されないと想定することしかできません。

各呼び出しの後に出力ステートメントを配置して、どこまで到達できるかを確認できますか? workstation.canAcceptWork()またはのどちらかworkstation.doWork()が犯人だと思います。

于 2013-11-14T12:21:24.697 に答える