这是我的应用程序的简化版本,显示了我在做什么。
/*
in my app's main():
Runner run = new Runner();
run.dowork();
*/
class Runner
{
private int totalWorkers = 2;
private int workersDone = 0;
public synchronized void workerDone()
{
workersDone++;
notifyAll();
}
public synchronized void dowork()
{
workersDone = 0;
//<code for opening a file here, other setup here, etc>
Worker a = new Worker(this);
Worker b = new Worker(this);
while ((line = reader.readLine()) != null)
{
//<a large amount of processing on 'line'>
a.setData(line);
b.setData(line);
while (workersDone < totalWorkers)
{
wait();
}
}
}
}
class Worker implements Runnable
{
private Runner runner;
private String data;
public Worker(Runner r)
{
this.runner = r;
Thread t = new Thread(this);
t.start();
}
public synchronized void setData(String s)
{
this.data = s;
notifyAll();
}
public void run
{
while (true)
{
synchronized(this)
{
wait();
//<do work with this.data here>
this.runner.workerDone();
}
}
}
}
这里的基本概念是我有一群工作人员,他们都独立地对传入的数据行进行一些处理,并在他们喜欢的任何地方写出数据 - 他们不需要将任何数据报告回主线程或彼此共享数据。
我遇到的问题是这段代码死锁了。我正在阅读一个超过 100 万行的文件,我很幸运在我的应用程序停止响应之前获得了 100 行。
实际上,工人们都在做不同数量的工作,所以我想等到他们都完成后再去下一条生产线。
我不能让工作人员以不同的速度处理并在内部对数据进行排队,因为我正在处理的文件太大而无法放入内存。
我不能给每个工人自己的 FileReader 来独立获取“线”,因为我在工人看到它之前就在线上进行了大量处理,并且不想在每个工人中重新进行处理。
我知道我在 Java 中缺少一些相当简单的同步方面,但我被困在这一点上。如果有人能解释我在这里做错了什么,我将不胜感激。我相信我误解了同步的某些方面,但我没有尝试修复它的想法。