【问题标题】:Multithread Write into Text File多线程写入文本文件
【发布时间】:2012-01-27 03:42:23
【问题描述】:

希望你能帮我解决这个问题。 我需要制作一个使用多个线程写入文本文件的程序。 我需要展示处理器如何“关注”一个线程或另一个线程,所以基本上,我需要所有线程同时运行,当然,同时写入。

这是我的代码。

方法一:使用“for”来创建和启动线程。

public class ThreadGenerator {

    public static void main(String[] args) {

        File textFile = new File("c:\\threadLog.txt");

        try {
            PrintWriter out = new PrintWriter(new FileWriter(textFile));

            for (int index = 0; index < 5; index++) {

            ThreadCustom thread = new ThreadCustom("ID" + index, out);
            thread.start();
            }

            out.close();

        } catch (IOException ex) {
            Logger.getLogger(ThreadGenerator.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

方法2:手动创建和启动每个线程

public class ThreadGenerator {

    public static void main(String[] args) {

        File textFile = new File("c:\\threadLog.txt");

        try {
            PrintWriter out = new PrintWriter(new FileWriter(textFile));

            ThreadCustom thread1 = new ThreadCustom("ID1", out);
            ThreadCustom thread2 = new ThreadCustom("ID2", out);
            ThreadCustom thread3 = new ThreadCustom("ID3", out);
            ThreadCustom thread4 = new ThreadCustom("ID4", out);
            ThreadCustom thread5 = new ThreadCustom("ID5", out);
            thread1.start();
            thread2.start();
            thread3.start();
            thread4.start();
            thread5.start();

            out.close();

        } catch (IOException ex) {
            Logger.getLogger(ThreadGenerator.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

这是我的 ThreadCustom 类

public class ThreadCustom extends Thread {

    private String threadId;
    private PrintWriter out;

    public ThreadCustom(String threadId, PrintWriter out){

        this.threadId = threadId;
        this.out = out;  
    }

    @Override
    public void run(){

        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        Calendar cal = Calendar.getInstance();

            this.out.println("Thread ID: "+this.threadId+" Enter Time: "+cal.getTime()+"\n");
            for(int index = 0; index < 10000; index++){

                this.out.println("Thread ID: "+this.threadId+" Current Time: "+cal.getTime()+"\n");
            }
            this.out.println("Thread ID: "+this.threadId+" Exit Time: "+cal.getTime()+"\n");
    }
}

所以,如您所见,我创建了一个 PrinterWriter,并将其作为参数提供以创建一个 ThreadCustom 对象,因此所有线程都使用相同的 PrinterWriter 对象(java 中的所有对象都作为引用传递,对吗?)

我期望得到什么?像这样的

Thread ID: ID0 Enter Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID1 Enter Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID1 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID1 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID Exit Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID1 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID0 Current Time: Fri Jan 27 00:38:54 CLST 2012
Thread ID: ID1 Exit Time: Fri Jan 27 00:38:54 CLST 2012

或类似的东西。

希望你能帮助我!

提前感谢社区!

PS:使用 .start() 确实会创建 .txt,但不会在其上写入任何内容,但是,如果我使用 .run() 而不是 .start(),它会写入 .txt,但顺序是(ID0、ID1、ID3 等)

【问题讨论】:

    标签: java multithreading file text


    【解决方案1】:

    在关闭输出之前,您必须等待您的线程完成它们的工作。最简单的方法是使用join

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
    
        thread1.join();
        thread2.join();
        thread3.join();
        thread4.join();
        thread5.join();
    
        out.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2011-12-31
      相关资源
      最近更新 更多