Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ExecutorService—调试和Eclipse中运行的不同输出_Java_Executorservice - Fatal编程技术网

Java ExecutorService—调试和Eclipse中运行的不同输出

Java ExecutorService—调试和Eclipse中运行的不同输出,java,executorservice,Java,Executorservice,我正在使用ExecutorJava框架编写代码,并在Eclipse上测试代码,但我看到了一件奇怪的事情。在eclipse上使用调试模式,我可以在控制台上打印输出,或者更好,当我使用调试模式单步执行(F5)时,我可以在控制台上打印输出,但如果我使用调试模式,使用步骤返回(F7)或我运行应用程序,它在控制台上不打印任何内容 以下是调试模式进入(F5)之前的我的输出: 使用带有步骤返回(F7)的调试模式或运行应用程序后: mapBuffer [] 使用相同的代码,我有两个不同的输出 public

我正在使用ExecutorJava框架编写代码,并在Eclipse上测试代码,但我看到了一件奇怪的事情。在eclipse上使用调试模式,我可以在控制台上打印输出,或者更好,当我使用调试模式单步执行(F5)时,我可以在控制台上打印输出,但如果我使用调试模式,使用步骤返回(F7)或我运行应用程序,它在控制台上不打印任何内容

以下是调试模式进入(F5)之前的我的输出:

使用带有步骤返回(F7)的调试模式或运行应用程序后:

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
*/