多线程文件拷贝要求:线程1从文件f:\1.txt读取文件,线程2通过线程1将内容保存至f:\2.txt。
import java.io.*; class Buffer { private char[] contents; private int size; private int state; public final static int FULL = 0; public final static int EMPTY = 1; public final static int UNSTABLE = 2; public final static int END = 3; public Buffer() { state = EMPTY; } public char[] getContents() { return contents; } public void setContents(char[] contents, int size) { this.contents = contents; this.size = size; } public int getSize() { return size; } synchronized public int getState() { return state; } synchronized public void setState(int state) { this.state = state; } } class Thread1 extends Thread { private String inputFile; private Buffer buffer; public Thread1(String inputFile) { this.inputFile = inputFile; this.buffer = new Buffer(); } public void run() { try { BufferedReader in = new BufferedReader(new FileReader(new File( inputFile))); int size = 0; while(true) { char[] contents = new char[102]; size = in.read(contents, 0, 100); if(size <= 0) break; synchronized(buffer) { if(Buffer.EMPTY != buffer.getState()) { buffer.wait(); } System.out.println("Thread1: " + size); buffer.setContents(contents, size); buffer.setState(Buffer.FULL); buffer.notify(); } } buffer.setState(Buffer.END); synchronized(buffer) { buffer.notify(); } in.close(); } catch (FileNotFoundException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (InterruptedException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } public Buffer getBuffer() { return buffer; } } class Thread2 extends Thread { private String outputFile; private Buffer buffer; public Thread2(String outputFile, Buffer buffer) { this.outputFile = outputFile; this.buffer = buffer; } public void run() { try { BufferedWriter out = new BufferedWriter(new FileWriter( new File(outputFile))); while(true) { synchronized(buffer) { int state; while(Buffer.FULL != (state = buffer.getState())) { if(Buffer.END == state) break; buffer.wait(); } if(Buffer.END == state) break; System.out.println("Thread2: " + buffer.getSize()); out.append(new String(buffer.getContents(), 0, buffer.getSize())); buffer.setState(Buffer.EMPTY); buffer.notify(); } } out.close(); } catch (IOException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (InterruptedException e) { System.err.println(e.getMessage()); e.printStackTrace(); } } } public class FileCopy { public static void main(String[] argv) { Thread1 thread1 = new Thread1("f:\\1.txt"); Thread2 thread2 = new Thread2("f:\\2.txt", thread1.getBuffer()); thread1.start(); thread2.start(); } } |
|
来自: CevenCheng > 《IO》