使用带锁的多线程来实现文件的拷贝
一个线程读,一个线程写
使用Lock
设计逻辑
需要两个线程类实现Runnable接口
需一个功能类完成读和写的方法
使用构造方法传参
功能类
public class ThreadCopy {
BufferedReader reader;
BufferedWriter writer;
boolean isRead=true;
final Lock lock=new ReentrantLock();
final Condition readCondition=lock.newCondition();
final Condition writeCondition=lock.newCondition();
public String hangString="";
public ThreadCopy(BufferedReader reader, BufferedWriter writer) {
super();
this.reader = reader;
this.writer = writer;
}
//读
public void readHang() {
System.out.println("=====读一行====");
lock.lock();
try {
while (!isRead) {
try {
readCondition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
hangString=reader.readLine();
Thread.sleep(1000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
isRead=!isRead;
writeCondition.signal();//唤醒对方
} finally {
lock.unlock();// TODO: handle finally clause
}
}
//写
public void writeHang() {
lock.lock();
try {
while (isRead) {
try {
writeCondition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
writer.write(hangString);
writer.newLine();
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
isRead=!isRead;
readCondition.signal();
} finally {
lock.unlock();// TODO: handle finally clause
}
}
}
线程类
public class Readxc implements Runnable {
ThreadCopy threadCopy;
public Readxc(ThreadCopy threadCopy) {
super();
this.threadCopy = threadCopy;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (threadCopy.hangString!=null) {
threadCopy.readHang();
}
}
}
public class Writexc implements Runnable {
ThreadCopy threadCopy;
public Writexc(ThreadCopy threadCopy) {
super();
this.threadCopy = threadCopy;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (threadCopy.hangString!=null) {
threadCopy.writeHang();
}
}
}
测试类
public class Testio {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// 使用带锁的多线程来实现文件的拷贝
//
// 一个线程读,一个线程写
//
// 使用Lock
BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\1906\\JAVA1906\\day34\\gbk.txt"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D:\\1906\\JAVA1906\\day34\\gbk1copy.txt"));
ThreadCopy threadCopy = new ThreadCopy(bufferedReader, bufferedWriter);
Readxc readxc = new Readxc(threadCopy);
Writexc writexc = new Writexc(threadCopy);
Thread t1= new Thread(readxc);
Thread t2= new Thread(writexc);
t1.start();
t2.start();
}
}