在我的程序中,我编写了一个类,每次触发新值时都会更新一堆监听器。因此我使用SingleThreadExecutor
,示例应该更清楚。我担心的是,当我像那样运行时,它是否有意义:
Class Update() {
ExecutorService svc = Executors.newSingleThreadExecutor();
svc.execute(new Runnable() {
public void run() {
if(!theListeners.isEmpty()) {
for(IgpsdListener l : theListeners) {
l.update(jsonObject);
}
}
}
});
我听说,在JAVA中创建Threads是相当昂贵的动作,所以我想知道我是否正确使用它。我的意思是,它每次创建一个新的Runnable
对象时都会创建吗?甚至Executor也只使用唯一的线程。
提前感谢任何帮助和启发。 nyyrikki
答案 0 :(得分:1)
这正是你应该做的。 Java在创建像这样的一次性对象方面非常快;线程可能很昂贵,但只是像你这样创建一个Runnable
便宜。
答案 1 :(得分:1)
就性能而言,您的代码很好。您没有解释jsonObject
的来源是什么,但是如果您的Runnable
是无状态的,那么您也可能只创建一个实例(可能不是这样,但仍然值得知道)
例如,如果这是您的整个代码:
class Update() {
private final List<IgpsdListener> theListeners = //...
private ExecutorService svc = Executors.newSingleThreadExecutor();
svc.execute(new Runnable() {
public void run() {
if(!theListeners.isEmpty()) {
for(IgpsdListener l : theListeners) {
l.update();
}
}
}
});
这可以简化为:
class Update() {
private final List<IgpsdListener> theListeners = //...
private ExecutorService svc = Executors.newSingleThreadExecutor();
final Notifier notifier = new Notifier()
//execute this as many times as you want with the same notififer instance
svc.execute(notififer);
class Notifier implements Runnable {
public void run() {
if(!theListeners.isEmpty()) {
for(IgpsdListener l : theListeners) {
l.update();
}
}
}
}