Java多线程问题.join()

标签 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说,这个方法会等待直到线程死亡。我缺少什么?

提前致谢

最佳答案

您需要在两个线程上调用 Thread.start() 而不是 Thread.run()start() 方法实际上会旋转一个新线程来并发执行代码,而 run() 方法是一个普通方法,与其他线程一样在调用线程中执行。

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

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()

关于Java多线程问题.join(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205486/

相关文章:

java - DropDownChoice 设置选定的特定索引

java - 如何对同步方法进行单元测试?

java - 多线程同时运行进程

c++ - 条件变量 - 等待/通知竞争条件

c++ - 如何从 C++ 中的线程开始(返回)

c - 生产者-消费者多线程段错误: core dump

java - 应用购买中的 Android 磨损

java - 获取链表中以特定字符开头的所有元素

java - 抽象基类还是类?

C程序: Parent read one file and child count the number of words.子程序有4个线程并且还使用了mapper和reducer