同步方法中的同步块

时间:2019-09-19 17:30:29

标签: java android multithreading synchronization

我的类中有一个套接字连接方法,一次只能由1个线程调用。在该同步方法中,我有一个基于随机对象的同步块。我正在通过Android服务调用班级的同步连接方法

问题: 有时,如果socketIO连接花费更长的时间建立连接,则 app进入无响应状态 当套接字URL无法访问时。我不知道为什么会这样。

class MyService extends Service {
    public void onStartCommand() {
       MyUtilClass.getInstance().init();
       MyUtilClass.getInstance().startSomeOSBroadcastListeners();
       MyUtilClass.getInstance().connectAsync();
    }
}

class MyUtilClass {

    private final Object tempObj = new Object();
    private MyUtilClass mUtilClass;

    public static MyUtilClass getInstance() {
        if(mUtilClass == null)
             mUtilClass = new MyUtilClass();

        return mUtilClass;
    }

    public void init() {
         startListeningSocketIoConnectEvent();
    }

    public MyUtilClass connectAsync() {
        new Thread(new Runnable() {
           connect();
        }).start();

     return this;
    }

    private synchronized MyUtilClass connect() {
        synchronized(tempObj) {

            mSocketIO.connect();
            tempObject.wait(); 
        }

       return this;
    }

    private void startListeningSocketIoConnectEvent() {

        mSocketIO.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                synchronized (mWaitLock) {
                    tempObj.notifyAll(); //releasing the lock
                }
            }
        });
    }
}

tempObj之后仅用于套接字IO连接阶段。

为什么有时会进入ANR状态?这个实施正确吗?

0 个答案:

没有答案