deadlock.java

来自「JGRoups源码」· Java 代码 · 共 238 行

JAVA
238
字号
// $Id: DEADLOCK.java,v 1.7 2005/08/08 12:45:42 belaban Exp $package org.jgroups.protocols;import org.jgroups.Address;import org.jgroups.Event;import org.jgroups.View;import org.jgroups.blocks.GroupRequest;import org.jgroups.blocks.MethodCall;import org.jgroups.stack.RpcProtocol;import org.jgroups.util.RspList;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Vector;class MyFrame extends Frame {    final List        list=new List();    final Label       result=new Label("Result:          ");    final Button      send=new Button("Send Request");    final Button quit=new Button("Quit");    final Panel       button_panel=new Panel();    final Panel       main_panel=new Panel();    DEADLOCK    deadlock=null;    Vector      members=null;            MyFrame(String title, DEADLOCK deadlock) {	this.deadlock=deadlock;	setSize(300, 200);	setTitle(title);	setBackground(Color.white);	setFont(new Font("Helvetica", Font.PLAIN, 12));	setLayout(new BorderLayout());	main_panel.setLayout(new GridLayout(0, 2));	main_panel.add(result);	main_panel.add(list);	button_panel.add(send);	button_panel.add(quit);	add("Center", main_panel);	add("South", button_panel);	addEventHandlers();    }    void addEventHandlers() {	quit.addActionListener(			       new ActionListener() {	    public void actionPerformed(ActionEvent e) {dispose();}	});	send.addActionListener(			       new ActionListener() {	    public void actionPerformed(ActionEvent e) {		Address dest;		int     res;		int     index=-1;				index=list.getSelectedIndex();		if(index == -1)		    return;		dest=members != null ? (Address)members.elementAt(index) : null;		if(dest != null) {		    res=deadlock.sendRequest(dest);		    setResult(res);		}	    }	});	    }    void setResult(int res) {	result.setText("Result: " + res);    }    void setMembers(Vector members) {	list.removeAll();	for(int i=0; i < members.size(); i++)	    list.add(members.elementAt(i).toString());	this.members=members;    }}/**   Tests the deadlock detection mechanism of RequestCorrelator. */public class DEADLOCK extends RpcProtocol {    MyFrame  frame=null;        public String  getName() {return "DEADLOCK";}    public void start() throws Exception {        super.start();        if(_corr != null)            _corr.setDeadlockDetection(true);        else            log.error("Cannot set deadlock detection in corr, as it is null !");        frame=new MyFrame(getName(), this);        frame.show();    }    public void stop() {        super.stop();        if(frame != null) {            frame.dispose();            frame=null;        }    }        public int sendRequest(Address dest) {	Object retval;		try {	    System.out.println("--> getCombinedResults() to " + dest);	    retval=callRemoteMethod(dest, "getCombinedResults", GroupRequest.GET_FIRST, 0);	}	catch(Exception e) {	    return -1;	}	if(retval != null && retval instanceof Integer)	    return ((Integer)retval).intValue();	return -1;    }    /* ------------------------- Request handler methods ----------------------------- */    /** Mcasts getResult() to all members (including itself). Returns the sum of all results. */    public int getCombinedResults() {	RspList  rsp_list;	Vector   results;	int      retval=0;	System.out.println("<-- getCombinedResults()");	System.out.println("--> getResult() to " + members);	MethodCall call = new MethodCall("getResult", new Object[] {}, new String[] {});	rsp_list=callRemoteMethods(members, call, GroupRequest.GET_ALL, 0);	results=rsp_list.getResults();	for(int i=0; i < results.size(); i++)	    retval+=((Integer)results.elementAt(i)).intValue();	return retval;    }    /** Returns a random integer value between 1 and 10 */    public static int getResult() {        System.out.println("<-- getResult()");        return (int)((Math.random() * 10) % 10) + 1;    }    /* --------------------- End of Request handler methods -------------------------- */        /**     * <b>Callback</b>. Called by superclass when event may be handled.<p>     * <b>Do not use <code>PassUp</code> in this method as the event is passed up     * by default by the superclass after this method returns !</b>     * @return boolean Defaults to true. If false, event will not be passed up the stack.     */    public boolean handleUpEvent(Event evt) {	switch(evt.getType()) {	case Event.TMP_VIEW:	case Event.VIEW_CHANGE:	    Vector new_members=((View)evt.getArg()).getMembers();	    synchronized(members) {		members.removeAllElements();		if(new_members != null && new_members.size() > 0)		    for(int i=0; i < new_members.size(); i++)			members.addElement(new_members.elementAt(i));	    }	    frame.setMembers(members);	    break;	case Event.SET_LOCAL_ADDRESS:	    frame.setTitle(frame.getTitle() + ": " + evt.getArg().toString());	    break;	    	}	return true;    }    /**       <b>Callback</b>. Called by superclass when event may be handled.<p>       <b>Do not use <code>PassDown</code> in this method as the event is passed down       by default by the superclass after this method returns !</b>       @return boolean Defaults to true. If false, event will not be passed down the stack.    */    public boolean handleDownEvent(Event evt) {	switch(evt.getType()) {	case Event.TMP_VIEW:	case Event.VIEW_CHANGE:	    Vector new_members=((View)evt.getArg()).getMembers();	    synchronized(members) {		members.removeAllElements();		if(new_members != null && new_members.size() > 0)		    for(int i=0; i < new_members.size(); i++)			members.addElement(new_members.elementAt(i));	    }	    System.out.println("Setting members");	    frame.setMembers(members);	    System.out.println("done");	    break;	}	return true;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?