在我正在开发的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()?
答案 0 :(得分:2)
好处是:你不是在重新发明轮子。
说真的:也许你的简单工作线程今天完成了这项工作。但是,机会迟早会发生;事情会变得更加复杂。从这个意义上说,"编程"总是在平衡“开放变革”和“变革”之间保持平衡。与#34;你不需要它"。
Executors框架的优点在于它提供了一个干净,易于掌握的抽象层。为什么担心线程,当你唯一关心的是提交任务?
而且你知道:这样的抽象允许很多东西......例如编写单元测试而不用担心不同线程中发生的事情;通过使用实际使用current thread的执行程序。每个人都曾为#34;多线程"代码知道这有多难......
答案 1 :(得分:1)
newSingleThreadExecutor
作为ExecutorService
的特殊类型非常有用。它比专用Thread
略有优势。唯一的区别是你不必通过实现自己的队列,同步和类似的东西来重新发明轮子。它已经过优化,可以使用低级同步模式来获得最佳性能,因此,如果您希望使用类似的功能,我仍然建议使用现有的东西。
此外,您提供的代码非常不正确:
wait()
和notify()
周围的同步。wait()
和notify()
完全没有必要,因为BlockingQueue
实施已经提供了等待功能。