Java多线程问题.join()

时间:2011-08-26 13:37:32

标签: java multithreading

我已经在这个和其他论坛中检查了不同的问题,但我找不到解决问题的方法。

我有一个运行ffmpegexiftool进程的应用程序。我有并发问题,我想使用Thread来控制它们。这就是我构建它的方式:

ExiftoolThread

public class ExiftoolThread extends Thread{

    String file;

    public ExiftoolThread(String file){
        this.file = file;
    }
     public void run(){
                serviceToExiftool(file);//Create metadata file
    }
}

FfmpegThread

public class FfmpegThread extends Thread{

    String itemName;

    public FfmpegThread(String itemName){
        this.itemName = itemName;
    }
     public void run(){
         serviceFFmpeg(itemName);//Create thumbnai froma  video
    }
}

主要电话

Thread exiftoolThread = new ExiftoolThread(file.getName());
        exiftoolThread.run();
        try {
            exiftoolThread.join(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        log.write("JSON file created.It contains the metadata. ");


            Thread ffmpegThread = new FfmpegThread(itemName);
            ffmpegThread.run();
            try {
                ffmpegThread.join(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            log.write("Thumbnail created successfully. ");

此调用结束后,有更多操作处理这些进程的结果,并且总是有一个被错过。我想这是因为其中一个(exiftool或ffmpeg)提前完成,然后在另一个完成之前该过程继续。

我正在使用ffmpegThread.join(3000);来跳过此问题,正如documentation所说,此方法等待直到线程死亡。我错过了什么?

提前致谢

2 个答案:

答案 0 :(得分:3)

您需要在两个主题上调用Thread.start()而不是Thread.run()start()方法实际上会旋转一个新线程来同时执行代码,而run()方法是一个在调用线程中执行的普通方法,就像任何其他方法一样。

此外,您可以通过使用join()替换java.util.concurrent.CountDownLatch来电来改善线程同步设置。您的主要代码如下所示:

CountDownLatch latch = new CountDownLatch(2);
Thread ffmpegThread = new FfmpegThread(itemName, latch);
Thread exifToolThread = new ExifToolThread(itemName, latch);
ffmpegThread.start();
exifToolThread.start();

latch.await(); // With optional timeout

你的两个辅助线程必须在完成后调用latch.countDown()

答案 1 :(得分:1)

您必须调用start()来运行新线程中的代码。此外,join()会阻止当前线程,因此您必须在启动所有线程后调用它。