Невозможно прочитать два файла одновременно в Java - PullRequest
0 голосов
/ 20 января 2012

Может ли кто-нибудь дать мне рабочий пример чтения двух файлов одновременно через потоки? а также, что было бы лучшим способом прочитать их за один раз.

public static void main(String args[]) {

         new Runnable(new File("D:/test1.log"),"thread1");
         new Runnable(new File("D:/test2.log"),"thread2");
    }

    private static class Runnable implements Runnable {
        private File logFilePath;
        Thread runner;
        // you should inject the file path of the log file to watch
        public Runnable(File logFilePath,String threadName) {
            this.logFilePath = logFilePath;
            runner = new Thread(this, threadName);
            runner.start();
        }
               _____READ LOGIC HERE____

}

Программа, генерирующая логи. Я не использую закрытие или сброс.

public final class Slf4jSample {
    static Logger logger = LoggerFactory.getLogger(Slf4jSample.class);
     static int i=0;

    public static void main(final String[] args) {

            int delay = 0; // delay for 5 sec. 


            int period = 10000;  // repeat every sec.
            Timer timer = new Timer();

            timer.scheduleAtFixedRate(new TimerTask() {
                    public void run() {
                        // Task here ...
                        logger.error("error"+i);
                        logger.warn("warn"+i);
                        logger.debug("debug"+i);
                            try{int i=0/0;
                            }catch(Exception e){
                                logger.error("Ecxeption"+i, e);
                            }

                   i++;




                    }
                }, delay, period);
        }
    }

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вы должны создать экземпляр объекта потока, как Thread t = new Thread(new Runnable(.....)) и передать работающий объект в конструкторе Thread. Затем вызов метода start для объекта потока запускает отдельный поток и вызывает метод runnable.

Вы не должны создавать новые потоки внутри конструктора Runnable.

3 голосов
/ 20 января 2012

Я не совсем уверен, какова ваша цель из краткого описания, но я просто хочу предупредить вас, что параллельное чтение файлов с одного жесткого диска, как правило, не очень хорошая идея, потому что механическую головку диска нужно искать следующее место чтения и, следовательно, чтение с несколькими потоками, заставит его продолжать подпрыгивать и замедлять, а не ускорять.

В случае, если вы хотите прочитать части файлов и обработать их параллельно, я рекомендую вам взглянуть на решение для одного производителя (для последовательного чтения файлов) для нескольких потребителей (для обработки файлов).

Редактировать : Если вы настаиваете на использовании нескольких считывателей, вам, вероятно, следует изменить свой код следующим образом:

public static void main(String args[]) {

     new Thread(new ThreadTask(new File("D:/test1.log")),"thread1").start();
     new Thread(new ThreadTask(new File("D:/test2.log")),"thread2").start();
}

private static class ThreadTask implements Runnable {
    private File logFilePath;        

    // you should inject the file path of the log file to watch
    public ThreadTask(File logFilePath) {
        this.logFilePath = logFilePath;
    }

    public void run() {
        // read file
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...