Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ExecutorService的最有效方法_Java_Executorservice - Fatal编程技术网

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不是。