2013-07-18 3 views
2

У меня есть две задачи, которые должны выполняться вместе. Первой задачей является сохранение данных в базе данных. И вторая задача записи видео.Выполнение двух задач одновременно в Java

В настоящее время я использую Thread для каждой задачи и запускаю его одновременно.

... 
Thread insertDb = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // Insert to Database 
       setDataMediaVisit(thumbStr); 
       insertVisitRecord(); 
      } 
     }); 

     Thread capture = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       if (getGraph().getState() == DSCapture.PREVIEW) { 
        getGraph().setCaptureFile("data/"+ CaptureController.getNoMr() +"/videos/"+videoStr, DSFilterInfo.filterInfoForProfile(new File("profiles/demo_profile800x570_WM8_VBR_100.prx")), DSFilterInfo.doNotRender(), true); 
        getGraph().record(); 
       } 

       setData(CaptureController.getNoMr()); 
      } 
     }); 

     insertDb.start(); 
     capture.start(); 
... 

Является ли приведенный выше код нить безопасной? Я хочу использовать EDT, но я знаю EDT для Java Swing Component. CMIIW

спасибо.

+1

для лучшей помощи (чтобы избежать любых догадок) отправить сообщение [SSCCE] (http: // sscce.org/), short, runnable, compilable – mKorbel

+2

Невозможно сказать. Это зависит от характера общего состояния и способа доступа к нему: getGraph(), getState(), setCaptureFile(), record() и т. Д. –

+0

Когда вы говорите, что делаете их одновременно, вы просто работаете обе задачи одновременно или вы записываете и немедленно сохраняете этот материал в базе данных? – Daniel

ответ

1

Защита от перегрева - это просто проблема, когда вы хотите использовать объект, который работает в определенном потоке с другим потоком. Здесь неясно, что вы используете объект share в этом 2 потоке или нет! Но, если вы хотите использовать какой-то доли объекта, или вы хотите, чтобы читать и писать из файла или специального масла, вы можете использовать блокировки объекта, как это:

final Object lock = new Object(); 

// In thread 1 
// TODO: do some process in thread on 

synchronized(lock) { 
    // TODO: Put the result in somewhere that thread2 want to read it 
} 


// In thread 2 
synchronized(lock) { 
    // TODO: get the result from the place that you put in thread 1 
} 

// TODO: do some process on thread 2 on the data 

Вы всегда должны помнить, что вам нужно поставить минимально возможным синхронизировать, потому что, если другой поток достигнет синхронизированной части, он будет ждать, пока поток 1 не завершит синхронизированный блок, и он может убить производительность вашего кода

Смежные вопросы