newSingleThreadExecutor与具有wait()和notify()的新Thread()

时间:2016-07-04 09:04:09

标签: java android multithreading

在我正在开发的Android应用程序中,我需要创建一个额外的线程来处理一些重复的任务。我只需要一个线程,任务非常简单但频繁,间歇,应该按顺序

我想出了Executors.newSingleThreadExecutor是这种情况的好方法。但是,我真的没有从创建新线程中获得使用它的好处。

不是使用Executors.newSingleThreadExecutor并使用submit()函数来排队任务,而只是制作一个专用线程是不好的?我会让它通过一个任务队列,当队列为空时,它将等待(),当主线程发送新任务时,它将通知()工作线程。这是不好的做法吗?

// loop for worker thread 
public class WorkerThrd extends Thread {

    public void run() { 
        while(true){

            while (!queue.empty()) {
                queue.getTask().doSth();
            }
            synchronized(this){
                try {
                    wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    } 
}

// from main thread 

private WorkerThread wthread;
public void initiation(){
    wthread = new WorkerThread();
    wthread.start();
}

public void postSth(){
    wthread.queue.post(new task()); // a thread safety queue 
    synchronized(wthread){
        if(wthread.getState() == Thread.State.WAITING) {
           wthread.notify();
        }
    }
}

P.S。虽然我假设队列是线程安全的,但每当我调用wait()或notify()时我是否需要一个synchronized块?即使只有一个线程会调用wait()而另一个线程会调用notify()?

2 个答案:

答案 0 :(得分:2)

好处是:你不是在重新发明轮子。

说真的:也许你的简单工作线程今天完成了这项工作。但是,机会迟早会发生;事情会变得更加复杂。从这个意义上说,"编程"总是在平衡“开放变革”和“变革”之间保持平衡。与#34;你不需要它"。

Executors框架的优点在于它提供了一个干净,易于掌握的抽象层。为什么担心线程,当你唯一关心的是提交任务?

而且你知道:这样的抽象允许很多东西......例如编写单元测试而不用担心不同线程中发生的事情;通过使用实际使用current thread的执行程序。每个人都曾为#34;多线程"代码知道这有多难......

答案 1 :(得分:1)

当代码需要时,

newSingleThreadExecutor作为ExecutorService的特殊类型非常有用。它比专用Thread略有优势。唯一的区别是你不必通过实现自己的队列,同步和类似的东西来重新发明轮子。它已经过优化,可以使用低级同步模式来获得最佳性能,因此,如果您希望使用类似的功能,我仍然建议使用现有的东西。

此外,您提供的代码非常不正确:

  1. 没有工人的实例化
  2. 缺少wait()notify()周围的同步。
  3. wait()notify()完全没有必要,因为BlockingQueue实施已经提供了等待功能。