关于ReentrantReadWriteLock小实例

来源:互联网 发布:linux翻译软件 编辑:程序博客网 时间:2024/06/11 16:23
package cn.test.thread;import java.util.Map;import java.util.HashMap;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * Created by lim on 2017/2/16. */public class TestThread {    public static void main(String[] args)throws Exception{        final Person person = new Person();        final Thread t1 = new Thread(new Runnable() {            @Override            public void run() {                try {                    int i = 0;                    //while (true)  {                       // i++;                        person.write("A","A");                        //Thread.sleep(1000);                   // }                } catch (InterruptedException e) {                    System.out.println("此线程已被挂起...");                    //e.printStackTrace();                }            }        });//        Thread t11 = new Thread(new Runnable() {//            @Override//            public void run() {//                System.out.println("取到了:"+person.read("A2").toString());//            }//        });        Thread t2 = new Thread(new Runnable() {            @Override            public void run() {                System.out.println("取到了:"+person.read("A1").toString());            }        });        //t11.start();        t1.start();        t2.start();        Thread.sleep(2000);        // interrupt 只能打断阻塞的线程        // 如果想打断正在运行的线程,我的方法:需要打断的业务中添加 Thread.sleep(100)        t1.interrupt();    }}class Person{    Map<String, Object> rmap = new HashMap<String, Object>();    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();    Lock r = lock.readLock();    Lock w = lock.writeLock();    public void write(String key, String msg) throws InterruptedException{        try {            // 加写入锁            // ( 如果你乐意<脑残>也可以加读锁,这样向map放值的动作变为可多个线程同时执行的了)            w.lock();            int i = 0;            while(true){                i++;                System.out.println("开始放入第...."+" :"+msg+i);                rmap.put(key+i,msg+i);//                try {//                    Thread.sleep(1000);//                } catch (InterruptedException e) {//                    //e.printStackTrace();//                }                if(i >= 20){                    break;                }            }        } finally {            w.unlock();        }    }    public Object read(String key) {        Object obj = null;        try {            // 加读锁            r.lock();            obj = rmap.get(key);        } catch (Exception e){            e.printStackTrace();        } finally {            r.unlock();        }        return obj;    }}
1 0
原创粉丝点击