java - 如何有效地使用多线程

标签 java multithreading

我想要完成一项已经完成的任务,除了这次使用多线程。我必须从文件中读取大量数据(逐行),从每行中获取一些信息,然后将其添加到 map 中。该文件超过一百万行长,因此我认为它可能会受益于多线程。

我不确定我的方法,因为我以前从未在 Java 中使用过多线程。 我想让 main 方法进行读取,然后将已读取的行提供给另一个线程,该线程将格式化字符串,然后将其提供给另一个线程以放入映射中。

public static void main(String[] args)
{
    //Some information read from file
    BufferedReader br = null;
    String line = '';
    try {
        br = new BufferedReader(new FileReader("somefile.txt"));
        while((line = br.readLine()) != null) {
            // Pass line to another task
        }


    // Here I want to get a total from B, but I'm not sure how to go about doing that

}


public class Parser extends Thread
{
    private Mapper m1;

    // Some reference to B
    public Parse (Mapper m) {
        m1 = m;
    }

    public parse (String s, int i) {
        // Do some work on S
        key = DoSomethingWithString(s);
        m1.add(key, i);
    }

}

public class Mapper extends Thread
{
    private SortedMap<String, Integer> sm;
    private String key;
    private int value;
    boolean hasNewItem;

    public Mapper() {
        sm = new TreeMap<String, Integer>;
        hasNewItem = false;
    }

    public void add(String s, int i) {
        hasNewItem = true;
        key = s;
        value = i;
    }

    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                if (hasNewItem) {
                    // Find if street name exists in map
                    sm.put(key, value);
                    newEntry = false;
                }   
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        // I'm not sure how to give the Map back to main. 
    }
}

我不确定我是否采取了正确的方法。我也不知道如何终止 Mapper 线程并在主线程中检索 map 。我将有多个 Mapper 线程,但我在上面的代码中只实例化了一个。

我还刚刚意识到我的 Parse 类不是线程,而只是另一个类(如果它不重写 run() 方法),所以我认为 Parse 类应该是某种队列。

还有想法吗?谢谢。

编辑: 感谢您的所有回复。看来,由于 I/O 将成为主要瓶颈,因此并行化不会带来多少效率优势。但是,出于演示目的,我走在正确的轨道上吗?我还是有点不知道如何使用多线程。

最佳答案

为什么需要多线程?你只有一张磁盘,而且它的速度只能这么快。几乎可以肯定,多线程在这种情况下没有帮助。如果确实如此,从用户的角度来看,这将是非常小的。多线程不是您的问题。从大文件中读取是您的瓶颈。

关于java - 如何有效地使用多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17957162/

相关文章:

java - 将 java maven 项目组件提取为单独的项目

java - 不明白这个xml行j2ee项目

java - Java 中的对象创建流程是如何工作的?

C pthreads 和信号

multithreading - Memcached get 和 put 方法是线程安全的吗

java - 暂停和恢复方法

java - 了解paintComponent

java - 我可以使用@Autowire 注释继承的最终属性吗?

multithreading - 德尔福 2010 : No thread vs threads

multithreading - 单个事件循环中是否允许使用多个 cURL 多句柄?