2

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、混合モード、共有)

4

3 に答える 3