2014-01-11 2 views
1

반복 메시지 목록을 통해 파일에 메시지를 쓰는 스레드를 일시 중지하고 싶습니다. 메시지 목록이 비어 있으면 스레드를 중지하고 목록에 메시지가있을 때 스레드가 다시 시작됩니다.실행중인 스레드를 일시 중지하고 필요할 때 동일한 스레드를 다시 시작하는 방법은 무엇입니까?

나는 stop, suspend(), resume 메소드가 사용되지 않음을 알고 있지만 스레드가 백그라운드에서 계속되면 CPU를 소비한다. 나는 많은 인터넷 검색을했지만 적절한 대답을 찾을 수 없습니다. 하나는

을 좀 도와주십시오 것은 여기 내 코드입니다 :

BlockingQueue가 존재 무엇
private Thread mFileWriterThread = new Thread() { 

    @Override 
    public synchronized void run()   { 
     while (mIsRunning) { 
      synchronized (mMessageList) { 
       Iterator it = mMessageList.iterator(); 
       while ((it.hasNext())) { 
        String message = (String) it.next(); 
        writeToFile(fileOutputStream, message); 
        mMessageList.remove(message); 

       } 
      } 
     } 
    } 

}; 

답변

3

. 오브젝트가 사용 가능할 때까지 스레드를 강제로 차단하는 take() 메소드가 있습니다. 문제는 간단한 생산자 - 소비자 설계로 해결할 수 있습니다.

내가 여기에 오라클의 예에서 가져온 최소한의 조각 붙여 해요 : 작동 예와 같이

물론 소비자의
class Producer implements Runnable { 
    private final BlockingQueue queue; 
    Producer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while (true) { queue.put(produce()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    Object produce() { ... } 
} 

class Consumer implements Runnable { 
    private final BlockingQueue queue; 
    Consumer(BlockingQueue q) { queue = q; } 
    public void run() { 
    try { 
     while (true) { consume(queue.take()); } 
    } catch (InterruptedException ex) { ... handle ...} 
    } 
    void consume(Object x) { ... } 
} 

프로듀서는 어떻게 든 큐를 공유 할 필요를 (단지 생성자에 전달 벌금).

0

스레드 블록 *을 만들기 위해 wait()를 사용하려고합니다. 그런 다음 notify()를 호출하여 스레드를 다시 깨운다. "자바 대기 알림"에 대한 Google은 당신에게 튜토리얼을 줄 것이다.

* 여기에서 차단이란 다른 스레드가 깨울 때까지 리소스를 사용하지 않고 대기하는 것을 의미합니다.

관련 문제