2013-07-18 4 views
2

두 개의 태스크가 함께 실행되어야합니다. 데이터를 데이터베이스에 저장하는 첫 번째 작업. 그리고 비디오 녹화의 두 번째 작업.Java에서 동시에 두 개의 태스크 실행

현재 각 작업마다 스레드를 사용하고 동시에 실행합니다.

... 
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 for Java Swing Component를 알고 있습니다. CMIIW

감사합니다.

+1

(추측을 피하기 위해) [SSCCE] (http : // sscce.org/), 짧게, 실행 가능, 편집 가능 – mKorbel

+2

불가능합니다. 공유 상태의 본질과 액세스되는 방식에 따라 달라집니다 : getGraph(), getState(), setCaptureFile(), record() 등 –

+0

동시에 수행하고 있다고하면, 두 작업을 동시에 수행하거나 녹화하고 즉시 해당 푸티지를 데이터베이스에 저장하고 있습니까? – Daniel

답변

1

THread safe는 다른 스레드와 함께 특정 스레드에서 실행중인 개체를 언제 사용 하시겠습니까? 이 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이 동기화 된 블록을 완료 할 때까지 기다리고 코드의 성능이 저하 될 수 있기 때문에 더 나은 도움말을 보려면