package thread.readwrite; import java.util.List; public class Read implements Runnable { private String name; private RWLogic logic; public Read(String name, RWLogic logic) { this.name = name; this.logic = logic; } public void run() { // 取数据 List<User> list = logic.read(this.name); StringBuffer buffer = new StringBuffer(); for (User obj : list) { buffer.append(" " + obj.getUsername() + " " + obj.getSalary()); } System.out.println("read, " + this.name + " , " + buffer.toString()); try { Thread.sleep(200); } catch (InterruptedException ex) { } } }
package thread.readwrite; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class RWLogic { private final List<User> list = new ArrayList<User>(0); private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock(); public List<User> read(String name) { r.lock(); System.out.println(name + " Acquires the readLock."); try { return list; } finally { System.out.println(name + " Releases the readLock."); r.unlock(); } } public void write(String name, User user) { w.lock(); System.out.println(name + " Acquires the writeLock."); try { //long timer = System.currentTimeMillis(); for (int i = 0; i < 300000000; i++) { } //System.out.println(System.currentTimeMillis()-timer); list.add(user); } finally { System.out.println(name + " Releases the writeLock."); w.unlock(); } } }
package thread.readwrite; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test { /** * @author jzh add 2011-12-24 * @param args */ public static void main(String args[]) { // 创建一个线程池(创建一个可根据需要创建新线程的线程池) // Executors 类提供了用于此包中所提供的执行程序服务的工厂方法 ExecutorService pool = Executors.newCachedThreadPool(); RWLogic logic = new RWLogic(); Runnable writeTask1 = new Write("发工资", logic, new User("jzh", 15000)); Runnable readTask1 = new Read("查工资", logic); Runnable writeTask2 = new Write("发工资", logic, new User("howsky", 13500)); Runnable readTask2 = new Read("查工资", logic); Runnable writeTask3 = new Write("发工资", logic, new User("jiang", 11500)); Runnable readTask3 = new Read("查工资", logic); pool.submit(writeTask1); pool.submit(readTask1); pool.submit(writeTask2); pool.submit(writeTask3); pool.submit(readTask2); pool.submit(readTask3); pool.shutdownNow(); } }
package thread.readwrite; public class User { private String username; private double salary; public User(String username, double salary) { this.username = username; this.salary = salary; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
package thread.readwrite; public class Write implements Runnable { private String name; private RWLogic logic; private User user; public Write(String name, RWLogic logic, User user) { this.name = name; this.logic = logic; this.user = user; } public void run() { logic.write(this.name, this.user); try { Thread.sleep(200); } catch (InterruptedException ex) { } } }