该程序是否引入了并行执行?

时间:2010-03-08 15:13:37

标签: java multithreading parallel-processing bonjour

这是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”调用对象的相应方法(“serviceRegistered”或“operationFailed”),该方法作为最后一个参数提供给DNSSD.register。程序员决定将什么放入“serviceRegistered”和“operationFailed”。很明显。

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

1 个答案:

答案 0 :(得分:1)

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

我不确定从您的operationFailed回调重试注册是一个好主意。至少在没有理解注册失败原因的情况下,只是用相同的参数重试它才有意义吗?