Java ExecutorService—调试和Eclipse中运行的不同输出
我正在使用ExecutorJava框架编写代码,并在Eclipse上测试代码,但我看到了一件奇怪的事情。在eclipse上使用调试模式,我可以在控制台上打印输出,或者更好,当我使用调试模式单步执行(F5)时,我可以在控制台上打印输出,但如果我使用调试模式,使用步骤返回(F7)或我运行应用程序,它在控制台上不打印任何内容 以下是调试模式进入(F5)之前的我的输出: 使用带有步骤返回(F7)的调试模式或运行应用程序后:Java ExecutorService—调试和Eclipse中运行的不同输出,java,executorservice,Java,Executorservice,我正在使用ExecutorJava框架编写代码,并在Eclipse上测试代码,但我看到了一件奇怪的事情。在eclipse上使用调试模式,我可以在控制台上打印输出,或者更好,当我使用调试模式单步执行(F5)时,我可以在控制台上打印输出,但如果我使用调试模式,使用步骤返回(F7)或我运行应用程序,它在控制台上不打印任何内容 以下是调试模式进入(F5)之前的我的输出: 使用带有步骤返回(F7)的调试模式或运行应用程序后: mapBuffer [] 使用相同的代码,我有两个不同的输出 public
mapBuffer
[]
使用相同的代码,我有两个不同的输出
public boolean readPieceCount() throws IOException {
//byte[] buffer = null;
SortedMap<Integer,byte[]> mapBuffer=new TreeMap<>();
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(() -> {
for (Integer i=0; i<NUMFILES;i++)
{
Path path = Paths.get(pathPieceCount+"pieceCount"+(i+1)+".csv");
if(Files.exists(path, LinkOption.NOFOLLOW_LINKS))
{
byte[] buffer = null;
try {
buffer = Files.readAllBytes(path);
mapBuffer.put(i+1, buffer);
} catch (IOException e) {
System.out.println("Exception on readPieceCount!!!");
}
}
}
});
System.out.println("mapBuffer ");
System.out.println(mapBuffer.values());
executor.shutdown();
/*
more code
*/
public boolean readPieceCount()引发IOException{
//字节[]缓冲区=空;
SortedMap mapBuffer=新树映射();
ExecutorService executor=Executors.newFixedThreadPool(1);
执行人提交(()->{
对于(整数i=0;i调试多线程应用程序不像单线程应用程序那样直接。调试模式下的应用程序输出将完全取决于放置断点的位置。在调试模式下,当它到达调试点时,执行该部分语句的线程将被挂起,其他线程将被挂起线程将执行并完成其任务。这意味着您的整个应用程序将不会等待恢复挂起的线程。由于挂起的线程中可能有多个线程,您需要检查恢复线程的顺序以及是否恢复了所有线程
从您的代码中很难说出输出的确切原因,而不知道您是如何调试的。但它看起来像您的主/父线程
在您恢复/启动/完成其他executor服务线程之前正在打印mapBuffer
值。您在这里处理的是并发性,因此基本上如果您的主线程点击System.out.println(mapBuffer.values());
执行器.submit(()->{}
是使用第一个映射缓冲区完成的。放入,您将打印一个空数组。在打印前放入一个等待条件以同步代码,在打印出结果SortedMap
之前使用
请查看如何正确执行的示例。更糟糕的是,在执行打印时,提交的任务可能尚未开始。谢谢我解决了我的问题。我可以问你另一段代码吗?在这种情况下,我应该在ExecutorService中使用带try\catch条件的代码。我可以将此代码添加到以前的代码中吗正如代码所示?同样,如果线程引发异常,您可以在线程本身上提供异常,也可以在catch块中使用某种信号在主线程中处理异常。任务对象上的一个简单标志executionSuccess
可以完成此任务,具体取决于您的要求。然后,catch块可以设置this、 executionSuccess=false
如果您以后想处理这个问题。我在线程本身上处理了异常。非常感谢您的帮助。
public boolean readPieceCount() throws IOException {
//byte[] buffer = null;
SortedMap<Integer,byte[]> mapBuffer=new TreeMap<>();
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(() -> {
for (Integer i=0; i<NUMFILES;i++)
{
Path path = Paths.get(pathPieceCount+"pieceCount"+(i+1)+".csv");
if(Files.exists(path, LinkOption.NOFOLLOW_LINKS))
{
byte[] buffer = null;
try {
buffer = Files.readAllBytes(path);
mapBuffer.put(i+1, buffer);
} catch (IOException e) {
System.out.println("Exception on readPieceCount!!!");
}
}
}
});
System.out.println("mapBuffer ");
System.out.println(mapBuffer.values());
executor.shutdown();
/*
more code
*/