Java线程同步问题synchronized

来源:互联网 发布:软件开发参考文献 编辑:程序博客网 时间:2024/04/28 04:47

Android USB 读写以前都是一读一写,但有些机器会出问题。就采用读写异步的方法。

关键不在USB,在线程异步,记录下。

使用对象锁,Object自带的,然后使用Object的方法wait和notify/notifyAll

使用方法简单,记录下


    public synchronized int LRA_setRegister(int index,int address, int value) {        int ret = 0xffff;        byte[] cmd  = {0x55,0x02,0x00,0x53,0x03,0x03,0x00,0x00};        mCMDNow = 0x53;        cmd[5] = (byte)index;        cmd[6] = (byte)(address);        cmd[7] = (byte)(value);        byte[] cmd4send = CRC16.data4Send(cmd);        writeUsbSerial(cmd4send,cmd4send.length);        synchronized (syncObject){            try {                syncObject.wait(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            ret = mRegisterSetValue;        }        return ret;    }    /**     * Read register value by address     * @param address of registers need to read     * @return data in register     */    public synchronized int LRA_getRegister(int index,int address) {        int ret = 0xffff;        byte[] cmd  = {0x55,0x02,0x00,0x54,0x02,0x03,0x00};        mCMDNow = 0x54;        cmd[5] = (byte)index;        cmd[6] = (byte)(address);        byte[] cmd4send = CRC16.data4Send(cmd);        writeUsbSerial(cmd4send,cmd4send.length);        synchronized (syncObject){            try {                syncObject.wait(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            ret = mRegisterReadValue;        }        return ret;    }    public byte[] LRA_getDeviceID() {        byte[] cmd  = {0x55,0x02,0x00,(byte) 0xFF,0x01,0x00,0x44,0x7e};        mCMDNow = (byte) 0xff;        writeUsbSerial(cmd,cmd.length);        synchronized (syncObject){            try {                syncObject.wait(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }        return mDeviceID;    }    private boolean mUSBReadSwitch = false;    private int mUsbReadDataLen = 20;    private byte[] mUsbReadData = new byte[mUsbReadDataLen];    private byte[] mUsbReadDataCLean = new byte[mUsbReadDataLen];    private byte mCMDNow = 0x00;    private Object syncObject = new Object();    //values return    private byte[] mDeviceID = new byte[13];    private byte mRegisterReadValue = 0x00;    private byte mRegisterSetValue = 0x00;    class UsbReadThread extends Thread{        @Override        public void run() {            super.run();            while (mUSBReadSwitch){                int ret = readUsbSerial(mUsbReadData,mUsbReadDataLen);//                Log.e("ivan","ret = " + ret);                if(ret != -1) {                    readReturnDataFromUSB(mCMDNow, mUsbReadData);                    System.arraycopy(mUsbReadDataCLean, 0, mUsbReadData, 0, mUsbReadDataLen);                }            }        }    }    public byte[] getmDeviceID(){        return mDeviceID;    }    private int readReturnDataFromUSB(byte cmd, byte[] dataRead){        int ret = 0xffff;        showDataDetail(dataRead,"readReturnDataFromUSB");        if(dataRead[0] == (byte)0xAA){            if(cmd == dataRead[3]){                switch (dataRead[3]){                    case 0x53:                        mRegisterSetValue = dataRead[5];//                        mListener.onEventCome(Event.EVENT_REGISTER_WRITE_RESULT_OK,ret);                        synchronized (syncObject) {                            syncObject.notify();                        }                        break;                    case 0x54:                        mRegisterReadValue = dataRead[5];//                        mListener.onEventCome(Event.EVENT_REGISTER_READ_RESULT_OK,mRegisterReadValue);                        synchronized (syncObject) {                            syncObject.notify();                        }                        break;                    case (byte) 0xff:                        System.arraycopy(dataRead,4,mDeviceID,0,13);                        showDataDetail(mDeviceID,"readReturnDataFromUSB");//                        mListener.onEventCome(Event.EVENT_DEVICEID_READ_RESULT,ret);                        synchronized (syncObject) {                            syncObject.notify();                        }                        break;                    default:                        break;                }            }else{//                Log.e("ivan","readReturnDataFromUSB Again");//                readReturnDataFromUSB(cmd);            }        }else if((dataRead[0] == 0x00) && (dataRead[1] == 0x00) && (dataRead[2] == 0x00) && (dataRead[3] == 0x00) && (dataRead[4] == 0x00)                && (dataRead[5] == 0x00)){            if(mListener != null) {                mListener.onUsbState(Event.OPEN_UART_STATE_PULLOUT);            }        }        return ret;    }


原创粉丝点击