Java スレッドと共有オブジェクトとの同期で少し経験を積み、単純なロックを実行しようとしています。私がやろうとしているのは、タイムスタンプ (または分) を 2 つの異なるスレッドでテキスト ファイルに挿入する Java アプリケーションを作成することです。一方のスレッドは奇数のタイムスタンプ (または分) のみをファイルに挿入し、もう一方のスレッドは偶数のタイムスタンプのみを同じファイル。一方のスレッドが挿入している間、もう一方のスレッドは挿入できず、通知されるまで待機します。ファイルの内容は、次のようにプロセスを閉じた後 (コンソールで Ctrl+C) にする必要があります。
2013-05-10 21:37:02 2013-05-10 21:37:03 2013-05-10 21:37:04 2013-05-10 21:37:05
また
2013-05-10 21:37 2013-05-10 21:38 2013-05-10 21:39 2013-05-10 21:40
まず第一に、ファイルに行を挿入するスレッドを1つだけ作成したかったのですが、何が問題なのかわかりません。これが私のコードです:
import java.io.*;
public class MyFileWriter
{
private FileWriter fwriter;
private BufferedWriter bufwriter;
public FileWriter getWriter()
{
return this.fwriter;
}
public void setWriter(FileWriter pfwriter)
{
this.fwriter = pfwriter;
}
public BufferedWriter getBufWriter()
{
return this.bufwriter;
}
public void setBufWriter(BufferedWriter pbfwriter)
{
this.bufwriter = pbfwriter;
}
public static void main(String[] args)
{
MyFileWriter myfile = new MyFileWriter();
try
{
FileWriter fstream = new FileWriter("output.txt");
myfile.setWriter(fstream);
BufferedWriter out = new BufferedWriter(fstream);
myfile.setBufWriter(out);
}
catch (IOException e)
{
System.out.println("Error : "+e.getMessage());
}
MyThread mt = new MyThread();
mt.setBufWriter(myfile.getBufWriter());
mt.start();
}
}
class MyThread extends Thread
{
private BufferedWriter bout;
private int count = 1;
public BufferedWriter getBufWriter()
{
return this.bout;
}
public void setBufWriter(BufferedWriter pbout)
{
this.bout = pbout;
}
public void run()
{
try
{
this.sleep(1000);
}
catch(InterruptedException e)
{
System.out.println("Error : "+e.getMessage());
}
try
{
this.bout.write("String # "+count);
this.bout.newLine();
}
catch(IOException e)
{
System.out.println("Error : "+e.getMessage());
}
this.count++;
}
}
MyThread mt が作成されて開始された後、スレッドが「output.txt」文字列をファイルに挿入し、コマンド プロンプトで Ctrl+C を実行すると、次のようになります。
ストリング #1 文字列 #2 弦 #3
しかし、何らかの理由でアプリケーション自体が終了し、空のファイルのみが取得されます(アプリを起動するとファイルに「文字列#1」が含まれることがありますが、ほとんどが空です)。誰かが私が間違っていることを教えてもらえますか?
OS: Windows XP SP3、Java バージョン:
Java バージョン "1.7.0_21" Java(TM) SE ランタイム環境 (ビルド 1.7.0_21-b11) Java HotSpot(TM) クライアント VM (ビルド 23.21-b01、混合モード、共有)