Многопоточная запись в текстовый файл

Надеюсь, вы поможете мне с этим. Мне нужно создать программу, которая, используя несколько потоков, записывает в текстовый файл. Что мне нужно, так это показать, как процессор уделяет «внимание» тому или иному потоку, поэтому в основном мне нужно, чтобы все потоки работали одновременно и, конечно, писали в одно и то же время.

Вот мой код.

Метод 1: Использование «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 и т. Д.)

5
задан unholysampler 27 January 2012 в 03:48
поделиться