У меня есть два Java-класса, которые называются Reader и Worker.Reader читает строки из текстового файла и передает эти строки рабочим, которые сортируют эти строки в дерево.Поэтому я создаю несколько рабочих потоков и 1 поток Reader:
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();
}
Когда мой Reader читает строку из текстового файла внутри метода run (), он передает эту строку одному из работниковвызывая
workers[i].add(string);
Рабочие в основном ничего не делают, пока этот метод не был вызван.Поэтому мне интересно, продолжает ли Reader читать текстовый файл сразу после того, как он передает этот параметр одному из рабочих?Или он возвращается из этого метода только после того, как Worker завершил работу со строкой?Другими словами, когда один Поток передает параметры другому, они оба продолжают делать свое дело, если только Поток, передающий параметры, не хочет получить какой-то ответ?
Надеюсь, вы, ребята, понимаете, что я имею в виду, очень сложнообъяснить.
РЕДАКТИРОВАТЬ: Спасибо за хорошие ответы!Вот код класса 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);
}
}
А вот работник:
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++;
}
}
Пока что он не делает ничего мудрого :) Думаю, я понял, что вы сказали.Я много читал эту книгу о параллелизме и выполнял некоторые упражнения на бумаге, но не пытался что-либо особо кодировать.