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; }
阅读全文
0 0
- Java线程同步问题synchronized
- synchronized线程同步问题
- java 线程同步 synchronized
- java 线程同步 synchronized
- java synchronized 线程同步
- Java 线程同步 synchronized
- Java线程同步synchronized
- java线程同步-synchronized
- java线程同步:synchronized
- java synchronized线程同步
- JAVA 线程同步 synchronized
- java 线程synchronized 线程同步
- java线程同步之synchronized
- Java 线程同步(synchronized)
- java 线程同步:synchronized 关键字
- java线程之同步synchronized
- java中synchronized,线程同步
- java线程同步 synchronized同步锁
- 关于 多态 ,重载,覆盖的一点 认知
- RabbitMQ(part3广播发消息到不同消费者)----Publish/Subscribe
- 安卓6.0运行时权限处理
- 分布式哈希算法
- Android Studio 如何引用aar包
- Java线程同步问题synchronized
- linux查看内存使用
- Java
- eslint的网址:http://blog.csdn.net/helpzp2008/article/details/51507428
- 二次采样
- Unity 模型碰撞
- php获得flv视频长度
- nginx 负载均衡时,一台tomcat宕机时的问题 自动切换
- P1855 榨取kkksc03