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;
}
}