2016-07-18 11 views
1

AndroidのOSやJavaの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を提供し、必要に応じてブロックする操作を行うため、ここでの実装は不必要に複雑です。これらの操作により、キューを同期させる必要がなくなり、waitおよびnotifyを呼び出すことができます。 – thewmo

+0

それは私が似たような方法を試してみたのですが、自分のキューを使用して失敗したおかげで、うまくいきました。 –

+0

@thewmoもっときれいにする。私は自分の答えを更新しました - もっと便利にすべきです –

関連する問題