2013-05-12 86 views
2

我想獲得一些Java線程的經驗和與共享對象的同步並執行簡單的鎖定。 我想要做的是創建Java應用程序插入時間戳(或分鐘)到2個不同線程的文本文件:一個線程將只插入奇數時間戳(或分鐘)文件,另一個線程將只插入甚至時間戳相同的文件。當一個線程正在插入時,另一個線程無法插入並等待通知。該文件內容必須經過的過程接近(按Ctrl + C控制檯)是這樣的:Java線程寫入文件

 
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 

首先我想只創建一個線程,這將在文件中插入線,只是無法弄清楚什麼是錯的。這裏是我的代碼:

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++; 
    } 

} 

我希望創建並啓動,該線程將插入到文件「output.txt的」串後MyThread的MT和我在命令提示符下執行Ctrl + C鍵後,我會有這樣的事情:

 
String #1 
String #2 
String #3 

,但應用程序完成某種原因本身,我得到空文件只(有時文件有「字符串#1」,當我啓動應用程序,但主要是 - 空)。 任何人都可以啓發我我做錯了什麼?

操作系統:Windows XP SP3,Java版本:

Java版本 「1.7.0_21」 的Java(TM)SE運行時環境(建立1.7.0_21-B11) 的HotSpot的Java(TM)客戶端虛擬機(建設23.21-b01,混合模式,共享)

回答

0

無論何時您在輸出文件或IO中輸出java時,都必須關閉輸出設備;在這種情況下,它好像你正在使用的BufferedWriter作爲輸出,所以無論你是寫文件,在該年底,只需鍵入

<output>.close(); 
<output> being the variable you use. 

,並應編寫所有inforamtion到文件。希望這可以幫助!!

+1

如果打算再次寫入同一個文件,則不是清零而是關閉。但另一方面,長時間保持文件打開會阻止f.ex。外部日誌旋轉程序正常工作。 – 2013-05-12 19:30:11

2

好吧,幾件事情。首先,你的run()方法只打印一行,而你只創建一個線程,所以我不確定你認爲其他行會來自哪裏。 run()將在新線程中運行一次,就是這樣。我想你假設run()將在一個循環中被調用,但它不會。

其次,您使用的是BufferedWriter,該類緩衝(保留)寫入流的數據,然後將其發送到文件,以便可以一次寫入大量數據以提高效率。問題是,如果您沒有手動關閉或刷新BufferedWriter - 而您沒有 - 那麼您的輸出將永遠不會寫入文件。如果您在每次寫入BufferedWriter後添加對flush()的調用,您將看到所有輸出都在文件中結束 - 儘管這首先消除了使用BufferedWriter的原因!

更好的解決方案是等待寫入線程終止(使用Thread.join(),然後關閉文件main()

+0

謝謝歐內斯特,排序寫入文件問題。 – t3rmin41 2013-05-15 04:10:01

0

爲了解決您的直接問題(關於單線程示例),之後立即mt.start();添加此語句mt.join();