Я пытаюсь написать простой видео-манипулятор, поэтому несколько раз в секунду мне нужно запустить новый поток (в настоящее время реализующий Runnable) для обработки текущего кадра, но у меня нет гарантии, сколько времени займет завершение каждого потока, ипоэтому я хочу ограничить количество потоков, которые могут работать одновременно, количеством процессоров на компьютере:
Runtime runtime = Runtime.getRuntime();
int nP = runtime.availableProcessors();
Но я должен гарантировать, что все созданные потоки выполняются в последовательности, поэтому неткадры сброшены.
Я также хотел бы показать пользователю, сколько времени потребуется, чтобы завершить обработку, основываясь на количестве потоков, оставшихся для выполнения, когда они отменяют задание, чтобы у них не было видеофайла снет трейлера.
Возможно ли это, используя любую комбинацию futureTask, Exector или ExecutorService?
Спасибо.
РЕДАКТИРОВАТЬ:
Привет, ребята, извините, даэто было довольно плохо сформулировано.Итак, что я на самом деле пытаюсь сделать, это получить кадр, выполнить некоторые манипуляции с изображением, а затем сохранить отредактированный отснятый материал обратно в новый файл.В данный момент я делаю это во время воспроизведения, поэтому каждый кадр обрабатывается, когда он вызывается таймером, затем таймер запускает поток для максимально быстрой обработки изображения, но в зависимости от количества выполняемых манипуляций это время будет различным.
Затем я хотел убедиться, что если обработка занимает больше времени, чем интервал, то для обработки используется только максимально эффективное число потоков и что все потоки, созданные после достижения этого предела, все еще обрабатываютсяи не упал или мусор.
Прочитав первые 3 комментария, я вижу, что это, вероятно, менее эффективный способ сделать это, и я предполагаю, что будет работать только один поток, чтобы поддерживать отзывчивость пользовательского интерфейса, но я не уверен, как продолжать добавлятьизображения в потоке для его обработки без использования огромного списка.Я предполагаю, что это будет что-то вроде:
В основном классе:
Timer actionPerformed {
List.add(decodedImage);
}
В рабочем классе:
run() {
while( timer.isRunning() ) {
if( runCount >= list.size()-1 ) {
try {
Thread.sleep(500);
} catch() {
/* Catchy stuff */
}
} else {
BufferedImage toProcess = list.get(runCount);
/* Do Processing here */
writeImageToStream();
list.remove(runCount);
runCount++;
}
}
}
Это правильно?
РЕДАКТИРОВАТЬ 2:
Итак, это то, что у меня есть:
public class timerEncode {
private long startTime;
ActionListener goAction = new ActionListener() {
public void actionPerformed( ActionEvent evt ) {
BufferedImage decoded = getNextImage();
long write_time = System.nanoTime();
new doImages(decoded, write_time).run();
}
};
Timer goTimer = new Timer(40,goAction);
private BufferedImage getNextImage() {
/* Does inconsequential stuff to retrieve image from the stream*/
}
private void recBtnActionPerformed(java.awt.event.ActionEvent evt) {
startTime = System.nanoTime();
goTimer.start();
}
private class doImages implements Runnable {
final BufferedImage image;
final long write_time;
public doImages(BufferedImage image, long write_time) {
this.image = image;
this.write_time = write_time;
}
public void run() {
BufferedImage out = toXuggleType(image, BufferedImage.TYPE_3BYTE_BGR);
/* Other time consuming processy stuff goes here */
/* Encode the frame to a video stream */
writer.encodeVideo(0,out,write_time-startTime, TimeUnit.NANOSECONDS);
}
private BufferedImage toType(BufferedImage source, int type) {
if( source.getType() != type ) {
BufferedImage temp = new BufferedImage(source.getWidth(),source.getHeight(),type);
temp.getGraphics().drawImage(source, 0, 0, null);
source = temp;
}
return source;
}
}
}
Это прекрасно работает, когда обработка изображения проста, но вы скоронатолкнуться на десятки параллельных потоков, пытаясь сделать свое дело, поскольку это становится немного более сложным, поэтому я спрашивал, как ограничить количество одновременных потоков, не отбрасывая их.Я не уверен, что порядок особенно важен в этом случае, так как я думаю, что написание кадров не по порядку поместит их в правильное место, так как время записи указано для каждого кадра, но это требует тестирования.