要求:線程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();
????}
}