java:线程不';是否无法完全完成run()方法?

java:线程不';是否无法完全完成run()方法?,java,multithreading,executorservice,threadpoolexecutor,Java,Multithreading,Executorservice,Threadpoolexecutor,我有一个程序,它可以从给定的根开始探索文件系统。该程序递归地从根点探索所有目录,并对tiff文件执行一个处理。实际上,它合并了两个tiff文件。我使用ExecutorService和ThreadPoolExecutor来处理合并函数 ExecutorService exec = Executors.newFixedThreadPool(threadsNumber); inputDirectoryProcess( inputDir ); exec.shutdown()

我有一个程序,它可以从给定的根开始探索文件系统。该程序递归地从根点探索所有目录,并对tiff文件执行一个处理。实际上,它合并了两个tiff文件。我使用ExecutorService和ThreadPoolExecutor来处理合并函数

     ExecutorService exec = Executors.newFixedThreadPool(threadsNumber);
     inputDirectoryProcess( inputDir );
     exec.shutdown();
     try {
         exec.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
     } catch (InterruptedException e) {
         e.printStackTrace();  
     }
此外,对于我使用的每个合并函数,请执行以下操作:

    exec.submit(new MultipageTask( a, Integer.toString( intDetector(directoryFiles.get(i + 1).getName())/2 ), out) );
以下是MultiGetTask类:

        public void run() {

        Thread thread = Thread.currentThread();
        System.out.println("start by " + thread.getName() + " (" + thread.getId() + ")");

        Integer[] resoulutions = null;

        try {

            BufferedImage image[] = new BufferedImage[tifImages.length];
            for (int i = 0; i < tifImages.length; i++) {
                resoulutions = getsize(tifImages[i].getPath());
                SeekableStream ss = null;
                ss = new FileSeekableStream(tifImages[i]);
                ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);

                PlanarImage op = null;
                op = new NullOpImage(decoder.decodeAsRenderedImage(0),
                        null, OpImage.OP_IO_BOUND, null);
                image[i] = op.getAsBufferedImage();
            }

            TIFFField[] fields = new TIFFField[3];
            // ResolutionUnit
            TIFFField fieldResUnit = new TIFFField(296, TIFFField.TIFF_SHORT, 1,
                    (Object) new char[] { 2 });
            fields[0] = fieldResUnit;

            // XResolution
            TIFFField fieldXRes = new TIFFField(282, TIFFField.TIFF_RATIONAL, 1,
                    (Object) new long[][] { { resoulutions[0], 1 } });
            fields[1] = fieldXRes;

            // YResolution
            TIFFField fieldYRes = new TIFFField(283, TIFFField.TIFF_RATIONAL, 1,
                    (Object) new long[][] { { resoulutions[1], 1 } });
            fields[2] = fieldYRes;

            TIFFEncodeParam params = new TIFFEncodeParam();
            params.setCompression( TIFFEncodeParam.COMPRESSION_GROUP4 );
            params.setExtraFields( fields );
            OutputStream out = new FileOutputStream(outDir + "\\" + image_name + ".tif");
            ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
            Vector vector = new Vector();
            for (int i = 1; i < tifImages.length; i++) {
                vector.add(image[i]);
            }
            params.setExtraImages(vector.iterator());
            encoder.encode(image[0]);
            out.close();
            System.out.println("end by " + thread.getName() + " (" + thread.getId() + ")");

        } catch (IOException e) {
            e.printStackTrace();  
        }
        increasetCount();
    }
}

public synchronized void increasetCount() {
    convertCount = convertCount + 2;
    updateBar( convertCount );
}
正如你所看到的,有些线程像28开始,但没有结束。这会导致丢失一些合并进程,并且程序无法处理所有tiff文件

注意:我应该提到,当我增加threadsNumber时,丢失的会增加

我怎样才能修好它?我想确保每个线程都完成了运行进程


感谢并为糟糕的英语感到抱歉。

如果您没有共享资源,并且不是死锁/活锁,请尝试用try/catch来包围您的代码

public class MultipageTask implements Runnable {
    private File[] tifImages;
    private String image_name;
    private String outDir;

    public MultipageTask(File[] tifImages, String image_name, String outDir) {
        this.tifImages = tifImages;
        this.image_name = image_name;
        this.outDir = outDir;
    }

    @Override
    public void run() {

        Thread thread = Thread.currentThread();
        System.out.println("start by " + thread.getName() + " (" + thread.getId() + ")");

            try{
                 // doing merge process
            }catch(Exception e){
              e.printStackTrace();
            }
            System.out.println("end by " + thread.getName() + " (" + thread.getId() + ")");


    }
}

您是否使用了sempahores、locks或conditions之类的工具?如果是这样的话,那就是死锁。你没有使用守护进程线程,是吗(通常情况下不是这样)?通过调用
shutdown
,您可以确保
ExecutorService
中的所有任务都已完成。我打赌是您的处理代码造成的。你能给我们看一下吗?谢谢你的回复,为了更清楚,我复制了所有的运行函数。run函数只能通过increasetCount()方法更改全局变量convertCount。对不起,我不知道。它看起来像是文件系统中的某种锁,但我一点也不确定。我只能建议您在每个I/O语句(打开/关闭/读/写)周围添加更多的调试行。如果抛出未捕获的异常,线程不会结束吗?此外,您的建议不会吞没
InterruptedException
s吗?一个线程将完成,但它不会执行打印它完成的代码。试一下/抓住就可以解决它。我只展示了一个例子,他可以缓存他需要的确切异常。啊,我当时没有得到:)NVM。谢谢回复,我编辑了帖子并完全复制了运行过程,它有try/catch!在您编辑的问题中,打印在
try
内,如果抛出异常,则不会打印。把它移到外面去
public class MultipageTask implements Runnable {
    private File[] tifImages;
    private String image_name;
    private String outDir;

    public MultipageTask(File[] tifImages, String image_name, String outDir) {
        this.tifImages = tifImages;
        this.image_name = image_name;
        this.outDir = outDir;
    }

    @Override
    public void run() {

        Thread thread = Thread.currentThread();
        System.out.println("start by " + thread.getName() + " (" + thread.getId() + ")");

            try{
                 // doing merge process
            }catch(Exception e){
              e.printStackTrace();
            }
            System.out.println("end by " + thread.getName() + " (" + thread.getId() + ")");


    }
}