Java 使用ExecutorService的最有效方法
在我的程序中,我编写了一个类,每当触发一个新值时,它都会更新一组侦听器。因此,我使用的是一个Java 使用ExecutorService的最有效方法,java,executorservice,Java,Executorservice,在我的程序中,我编写了一个类,每当触发一个新值时,它都会更新一组侦听器。因此,我使用的是一个SingleThreadExecutor,这个示例应该让它更清楚。我担心的是,当我这样运行它时,它是否有意义: Class Update() { ExecutorService svc = Executors.newSingleThreadExecutor(); svc.execute(new Runnable() { public void run() {
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中创建线程是非常昂贵的操作,所以我想知道我是否正确地使用了它。我的意思是,它每次都会创建一个新的Runnable
对象,对吗?即使执行器也只使用唯一的线程
提前感谢您的帮助和启发。
尼里基这正是你应该做的。Java在创建像这样的一次性对象方面相当快;线程可能很昂贵,但是像您在这里这样创建一个
可运行的是很便宜的。就性能而言,您的代码很好。您没有解释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();
}
}
}
});
类更新(){
私人最终列表侦听器=/。。。
私有ExecutorService svc=Executors.newSingleThreadExecutor();
execute(新的Runnable(){
公开募捐{
如果(!theListeners.isEmpty()){
对于(IgpsdListener l:侦听器){
l、 更新();
}
}
}
});
这可以简化为:
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();
}
}
}
}
类更新(){
私人最终列表侦听器=/。。。
私有ExecutorService svc=Executors.newSingleThreadExecutor();
最终通知程序通知程序=新通知程序()
//使用同一Notifier实例执行此操作,次数可以根据需要而定
svc.执行(通知人);
类通知程序实现可运行{
公开募捐{
如果(!theListeners.isEmpty()){
对于(IgpsdListener l:侦听器){
l、 更新();
}
}
}
}
我会将if(!theListeners.isEmpty())
移动到execute()之外。添加一个没有任何作用的任务是没有意义的。我假设您正在重用您的执行器,而不是为每个任务创建一个。执行器只创建一次,对吗?如果我移动if(),您提到的完全有意义
在execute()
之外,如果没有为事件注册侦听器,任务甚至不会执行。没有看到,很好…谢谢!runnable很便宜,executer不是。