线程从文件中读取并将数据放在数组中而不是在arraylist中,文件中有267752个字符串字

时间:2015-04-02 19:17:23

标签: java arrays multithreading runnable volatile

我有理解线程的问题。有人可以帮助我知道我如何能够完成这个程序的其余部分。以下是程序文本:

程序将读取一个文件,每行一个字。单词应存储在表(数组)中,然后k个线程查找表中给定单词出现的次数。如果您的程序被称为Finde.java应该是示例。以这种方式开始:

  

java Finde father myfile.txt 8

您将在文件myfile.txt中找到使用8个线程的单词father的次数。因此,k = 8

请记住考虑到k可能是1.当读入文件时,主 - 线程共享表约k个等长的部分,并启动k个线程来查看每个部分。当一个线程发现其部分中出现的字数时,应将其报告给一个公共对象(监视器)。主 - 线程应该等到所有线程都完成搜索,检索监视器的总发生次数,最后写出这个数字。

以下是我现在提出的代码:

import java.io.File;

import java.io.IOException;

import java.util.Scanner;



public class Main {

    public static void main(String[] args) {

        CommonObject co = new CommonObject();
        Finde f = new Finde();

        Scanner file = null;
        String[] read = new String[267752];

        try{ 
            file = new Scanner(new File("myfile.txt")); 
        }
        catch(IOException e){ 
            e.printStackTrace();
        }   

        while(file.hasNext()){

            for ( int i = 0; i < read.length; i++){ 
                read[i] = file.next();
                Runnable r = new Thread(read[i]);
                Thread t = new Thread(r);
                t.start();
            }
        }
    }
}


public class CommonObject {

    private final int K = 8;
    private String word;
    private int count = 0;

    synchronized void findeWord(String word) {
        this.word = word;
    }

    synchronized void countWord(int count) {

        count = count;
    }
}

public class Finde implements Runnable {
    static volatile int i;

    public void run() {
        while(true) {

        }
    }
}

1 个答案:

答案 0 :(得分:0)

读取主线程中的文件,然后同时读取这些行:

使用Java 8:

final List<String> allLines = Files.readAllLines(file);
Future<Integer> fr = new ForkJoinPool(k).submit(() ->
    return allLines.parallelStream()
                   .flatMap(s -> s.split(" "))
                   .filter(s -> s.equals(word))
                   .count();
);
int res = fr.get();