我已经在这个和其他论坛中检查了不同的问题,但我找不到解决问题的方法。
我有一个运行ffmpeg
和exiftool
进程的应用程序。我有并发问题,我想使用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所说,此方法等待直到线程死亡。我错过了什么?
提前致谢
答案 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()
会阻止当前线程,因此您必须在启动所有线程后调用它。