Java:将参数传递给另一个线程的线程

Ken*_*rts 3 java parameters multithreading

我有两个名为Reader和Worker的java类.Reader从文本文件中读取字符串,并将这些字符串传递给Workers,这些字符串将这些字符串排序为树.所以我创建了许多Worker-threads和1个Reader-thread:

        try {      

        /* Create and run worker processes. */
        workers = new TrieWorker[numberOfWorkers];
        for(int i = 0; i < numberOfWorkers; i++)
        {
            workers[i] = new TrieWorker(this);
            new Thread(workers[i]).run();
        }

        /* Create and run reader process. */
        reader  = new TrieReader(this, filename);                        
        new Thread(reader).run();

    } catch(Exception e) {
        e.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

当我的Reader从run() - 方法内的文本文件中读取字符串时,它通过调用将字符串传递给其中一个worker

workers[i].add(string);
Run Code Online (Sandbox Code Playgroud)

在调用此方法之前,工人基本上什么都不做.所以我想知道,Reader在将此参数传递给其中一个Worker之后是否会立即继续从文本文件中读取?或者只有在完成字符串后,它才会从此方法返回?换句话说,当一个Thread将参数传递给另一个时,除非Thread传递参数需要某种回答,否则它们都会继续做自己的事情吗?

希望你们知道我的意思,真的很难解释.

编辑:谢谢你的好答案!这是Reader类的代码:

private static int numberOfNextWorker = 0;

    public void run() 
{
    System.out.println("Reader run.");

    try {
        System.out.println("Reading " + filename);
        read();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public void read() throws Exception
{
    File file = new File(filename);
    Scanner reader = new Scanner(file);

    if(file.canRead() == false)
        throw new Exception("file " + filename + " cannot be read.");

    long totalLength = file.length();

    while(reader.hasNextLine())
    {

            String text = reader.nextLine();          
            numberOfLines++;

            /* Passes the work on to workers. */
            if(numberOfNextWorker == (numberOfWorkers - 1))
                 numberOfNextWorker = 0;
            else
                 numberOfNextWorker++;

            workers[numberOfNextWorker].add(text); 
        }
}
Run Code Online (Sandbox Code Playgroud)

在这里工人:

    public void run() 
{
    System.out.println("Worker run.");
}

void add(String text) 
{
    numberOfStrings++;
    char[] chars = text.toCharArray();

    int i = 0;
    Node node = new Node();

    while (chars.length > i) {
        node.value = chars[i];
        node = node.children;
        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

它没有做任何明智的事:)我想我理解你所说的.我已经阅读了很多关于并发性的书,并在纸上做了一些练习,但没有尝试过那么多的代码.

MBy*_*ByD 6

请注意,您不是在任何时候启动新线程,而是仅在同一线程上调用run()方法.

您需要调用以start()生成新线程,例如:

new Thread(workers[i]).start();
Run Code Online (Sandbox Code Playgroud)

代替

new Thread(workers[i]).run();
Run Code Online (Sandbox Code Playgroud)

线程如何继续工作取决于您的实现.