2016-07-18 2 views
1

안드로이드 OS 또는 자바 AWT 스레드와 비슷한 작업을 수행 할 수있는 방법이 있습니까? 예를 들어 어떤 스레드에서 어떤 스레드가 호출되었는지에 관계없이 특정 스레드에서 작업이 실행됩니다. repaint(). 내가이 상황에, 이런 식으로 뭔가를 달성 할 수있는 방법활성 상태 인 특정 스레드에서 작업을 실행하는 방법은 무엇입니까?

private Thread thread; 
    public void startThread(){ //method which start's my thread 
    thread = new Thread(new Runnable(){ 
     doSomething(); 
    }); 
    thread.start() 
    } 

    public void submitTask(Runnable runnable){ 
    //run the runnable task on the thread "thread" 
    } 

두 개 이상의 활성 스레드 내가이 시나리오는 전에 작업 대기열 및 처리하는 스레드를 만드는 것입니다 처리 한 방법

+0

답변이 도움이 되었습니까? –

답변

1

그것에 추가되는 작업. 따라서 모든 스레드는 대기열에 작업 항목을 추가 할 수 있으며 동일한 스레드가 작업 항목을 추가 한 스레드에 상관없이이를 처리합니다.

public class MyClass { 

    private LinkedBlockingQueue<MyTask> myTaskProcessingQueue; 

    public MyClass() { 
     myTaskProcessingQueue = new LinkedBlockingQueue<MyTask>(); 
     new MyTaskWorker().start(); 
    } 

    public void processTask(MyTask myTask) { 
     myTaskProcessingQueue.put(myTask); 
    } 

    private class MyTaskWorker extends Thread { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        processMyTask(myTaskProcessingQueue.take()); 
       } catch (InterruptedException ie) { 
        // handle it 
       } 
      } 
     } 

     private void processMyTask(MyTask myTask) { 
      // do work 
     } 
    } 
} 
+1

작업 대기열이 올바른 해결책입니다. 사실 AWT 재 페인트/페인트가 장면 뒤에서 발생하고 다른 모든 UI 이벤트 전달과 함께 발생합니다. 그러나 LinkedBlockingQueue는 스레드 안전 put/offer를 제공하고 필요한 경우 차단하는 작업을 수행하므로 불필요하게 복잡합니다. 이러한 조작은 대기열에서 동기화 할 필요를 없애고 대기 및 통지를 호출합니다. – thewmo

+0

그것은 비슷한 방법을 시도했지만 내 자신의 대기열을 사용하여 실패한 덕분에 이상하게 작동했습니다. –

+0

@thewmo put 및 take 조작에 대한 호출이 좋습니다. 훨씬 더 청결하게 만듭니다. 내 대답을 업데이트했습니다 - 더 유용하게 만들어야합니다. –

관련 문제