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

2

曾经发生在我身上,我无法让 Intellij Idea 在断点处停止。基本上问题是一旦一个线程在断点处停止,其他线程就不会停止。

断点属性对话框中有一个设置可以防止这种情况发生。

右键单击断点并选择“查看断点”。

在对话框中选择一个断点。

您会注意到挂起复选框 2 单选按钮的右侧:AllThread选。此外,您可以将其设为默认值(右侧的Make Default按钮)。默认值将用于您添加的任何新断点。旧的需要手动更改。

编辑 Intellij 帮助站点上的附加信息:断点选项

断点对话框

于 2013-10-01T17:02:27.107 回答
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 方法中没有抛出异常,我只能假设其中一个调用永远不会返回。

你能在每次调用后放置输出语句,看看你能走多远吗?我猜要么要么workstation.canAcceptWork()workstation.doWork()罪魁祸首。

于 2013-11-14T12:21:24.697 回答
0

我遇到了一个类似的问题,即 IntelliJ 从未在 Runnable 类的 run() 方法中命中我的断点。我发现断点的唯一位置是在public void run() {.

于 2020-01-07T08:25:08.937 回答