无法在java中同时读取两个文件

时间:2012-01-20 11:30:49

标签: java multithreading file-io

有人能给我一个通过线程同时读取两个文件的工作示例吗?还有什么是一次阅读它们的最佳方式。

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____

}

生成log的程序。我没有使用任何关闭或刷新。

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 个答案:

答案 0 :(得分:3)

我不太确定你的目标是什么,从简短的描述,但我只是想警告你,从单个硬盘并行读取文件通常不是一个好主意,因为机械磁盘头需要寻求下一个读取位置,因此使用多个线程读取将导致它继续弹跳并减慢速度而不是加速它们。

如果您想要阅读部分文件并以平行方式处理它们,我建议您查看单个生产者(按顺序读取文件)多个消费者(处理文件)解决方案。

修改:如果您坚持使用多个阅读器,您可能应该像这样更改代码:

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

答案 1 :(得分:3)

您必须实例化Thread t = new Thread(new Runnable(.....))之类的线程对象 并在Thread的构造函数中传递runnable对象。 然后在线程对象上调用start方法将启动单独的线程并调用Runnable的run方法。

您不应该在Runnable的构造函数中创建新线程。