最近研究JPDA,具体说是JDI(Java Debug Interface),关于各种EventRequest在处理时的suspend policy的设置不太理解。在JDK6.0给出的example中(%javahome%\demo\jpda\examples.jar),找到如下代码:
/**
     * Create the desired event requests, and enable 
     * them so that we will get events.
     * @param excludes     Class patterns for which we don't want events
     * @param watchFields  Do we want to watch assignments to fields
     */
    void setEventRequests(boolean watchFields) {
        EventRequestManager mgr = vm.eventRequestManager();        // want all exceptions
        ExceptionRequest excReq = mgr.createExceptionRequest(null, 
                                                             true, true); 
        // suspend so we can step
        excReq.setSuspendPolicy(EventRequest.SUSPEND_ALL);
        excReq.enable();        MethodEntryRequest menr = mgr.createMethodEntryRequest();
        for (int i=0; i<excludes.length; ++i) {
            menr.addClassExclusionFilter(excludes[i]);
        }
        menr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
        menr.enable();        MethodExitRequest mexr = mgr.createMethodExitRequest();
        for (int i=0; i<excludes.length; ++i) {
            mexr.addClassExclusionFilter(excludes[i]);
        }
        mexr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
        mexr.enable();        ThreadDeathRequest tdr = mgr.createThreadDeathRequest();
// Make sure we sync on thread death
        tdr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
        tdr.enable(); if (watchFields) {
    ClassPrepareRequest cpr = mgr.createClassPrepareRequest();
    for (int i=0; i<excludes.length; ++i) {
cpr.addClassExclusionFilter(excludes[i]);
    }
    cpr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
    cpr.enable();
}
    }其中各种EventRequest的suspend policy设置不太相同,比如,MethodExitRequest的处理使用的是EventRequest.SUSPEND_NONE,既在处理该事件时不挂起任何其他线程,而其他的一些EventRequest,比如ExceptionRequest的设置就是EventRequest.SUSPEND_ALL,而且根据官方文档,还有一种suspend policy是SUSPEND_EVENT_THREAD,我想知道这些设置是不是和Java语言本身或者JVM的某些特性有关,设置时应该以什么为依据?谢谢各位对JAVA和JAVA虚拟机熟悉的大侠,问题紧急,如有帮助,必有高分相送。