【问题标题】:Does this program introduce a parallel execution?该程序是否引入了并行执行?
【发布时间】:2010-03-08 15:13:36
【问题描述】:

这是simple server application using Bonjour and written in Java。代码的主要部分在这里给出:

public class ServiceAnnouncer implements IServiceAnnouncer, RegisterListener {
    private DNSSDRegistration serviceRecord;
    private boolean registered;

    public boolean isRegistered(){
        return registered;
    }

    public void registerService()  {
        try {
            serviceRecord = DNSSD.register(0,0,null,"_killerapp._tcp", null,null,1234,null,this);
        } catch (DNSSDException e) {
            // error handling here
        }
    }

    public void unregisterService(){
        serviceRecord.stop();
                registered = false;
    }

    public void serviceRegistered(DNSSDRegistration registration, int flags,String serviceName, String regType, String domain){
        registered = true;
    }

    public void operationFailed(DNSSDService registration, int error){
        // do error handling here if you want to.
    }
}

我是这样理解的。我们可以尝试注册一个调用“registerService”方法的服务,该方法又调用“DNSSD.register”方法。 “DNSSD.register” 尝试注册服务,一般情况下,它会得到两个结果:服务“注册成功”和“注册失败”。在这两种情况下,“DNSSD.register”都会调用作为最后一个参数提供给 DNSSD.register 的对象的相应方法(“serviceRegistered”或“operationFailed”)。程序员决定将什么放入“serviceRegistered”和“operationFailed”。很清楚。

但是我应该尝试从“操作失败”中注册服务吗?恐怕这样我的应用程序会过于频繁地尝试注册服务。我应该在“操作失败”中添加一些“睡眠”还是“暂停”?但无论如何,在我看来,当应用程序无法注册服务时,它也将无法做其他事情(例如处理 GUI)。或者可能是 DNSSD.register 引入了某种并行性?我的意思是它启动了一个新线程,但是如果我尝试从“操作失败”注册服务,我可以生成大量线程。会发生吗?如果是这种情况,它应该是一个问题吗?如果是这样,我该如何解决这个问题?

【问题讨论】:

    标签: java multithreading parallel-processing bonjour


    【解决方案1】:

    是的,来自 DNSSD API 的回调可以异步地来自另一个线程。这个exerpt from the O'Reilly book on ZeroConf networking 提供了一些有用的信息。

    我不确定从您的 operationFailed 回调中重试注册是个好主意。至少在不了解注册失败的原因的情况下,简单地使用相同的参数重试是否有意义?

    【讨论】:

      猜你喜欢
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多