读取多个线程的文件

时间:2017-06-17 13:37:49

标签: java multithreading

是否可以通过运行多个线程来读取文本文件,以便接收到的行包含有关读取此行的线程的信息? 现在,我可以用一个帖子阅读:

public class Test {

    public static void main(String[] args) throws InterruptedException {
        Deque<String> deque = new LinkedList<>();
        for (int i = 0; i < 4; i++) {
            new Thread(new SubReadThread(deque)).start();
        }
        new Thread(new WriteThread(deque)).start();
    }

}

class SubReadThread implements Runnable {
    private final Deque<String> deque;

    public SubReadThread(Deque<String> deque) {
        this.deque = deque;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new     FileInputStream("list.txt"), "UTF8"));
            String line = null;
            String newLine;
            while (true) {

                synchronized (deque) {
                    if (deque.size() < 1) {
                        line = br.readLine();
                        newLine = "#" + (Thread.currentThread().getId() - 9) + " " + line;
                        deque.addLast(newLine);
                        deque.notify();
                    } else {
                        deque.wait();
                    }
                    if (line == null) {
                        break;
                    }
                }
            }

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class WriteThread implements Runnable {
    private final Deque<String> deque;
    private List<String> list = new ArrayList<>();

    public WriteThread(Deque<String> deque) {
        this.deque = deque;
    }

    @Override
    public void run() {
        String line;

        while (true) {
            synchronized (deque) {
                if (deque.size() > 0) {
                    if ((line = deque.pollFirst()).contains("null")) {
                        break;
                    } else {
                        list.add(line);
                        deque.notifyAll();
                    }
                } else {
                    try {
                        deque.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        for(String s : list) {
            System.out.println(s);
        }
    }
}

预期输出如下:

  

#3 line1

     

#1 line2

     

#4 line3

     

#2 line4

     

...............

UPDATE 正常工作所需的一切,将BufferedReader移动到main方法并将其对象传递给构造函数。

0 个答案:

没有答案