可重入锁对socket.read不好使的问题

来源:互联网 发布:工商银行软件官方下载 编辑:程序博客网 时间:2024/05/18 00:12

先写一个愚蠢的错误让大家开心开心,本来想所run里面的逻辑的,你这能锁住???搞笑一样。。。。。。。


synchronized(this){    new Thread(new Runnable() {        public void run() {                      ..................                 }    }).start();                    //大哥,里面是一个 Thead.start你怎么锁的住啊,大哥!!!!!!!!!!!!!!!!!!!!!!}           


言归正传,下面的代码对run里面的代码进行了加锁,但是线程在获取锁的过程中是无法中断的,而socket.read会一直阻塞线程,导致锁无法被释放,其他线程无法执行run方法。

new Thread(new Runnable() {    public void run() {        synchronized (Bluetooth.this){   //注意这个地方是锁外部类,而不是this,this是Thread!!!!               socket.read() //synchronized保证指令顺序执行        }    }}).start();


博主采用了handler的postDelay和remmoveCallback 来实现当read方法阻塞的时候,把已经读取的网络数据post到主线程。但是这并没有解决read阻塞导致后续线程无法获得锁的问题,(socket.close()会使read方法抛出java.io.IOException: bt socket closed, read return: -1 ,从而解除阻塞)



myHandler = new Handler(Looper.getMainLooper());myHandler.postDelayed(myRunnable, 1000);readCount += in.read(b, readCount, count - readCount);myHandler.removeCallbacks(myRunnable);


最终灵感突现,想到了ReentrantLock (可重入锁,终于明白啥叫可重入了。。。。可怜)  

socket.read这么NB,可重入锁(超时可重入)都不能使它结束阻塞??


java 显式锁ReentrantLock使用详解之测试锁与超时


原创粉丝点击