首先,这是一个激励人的示例:
public class Algorithm
{
public static void compute(Data data)
{
List<Task> tasks = new LinkedList<Task>();
Client client = new Client();
int totalTasks = 10;
for(int i = 0; i < totalTasks; i++)
tasks.add(new Task(data));
client.submit(tasks);
}
}
// AbstractTask implements Serializable
public class Task extends AbstractTask
{
private final Data data;
public Task(Data data)
{
this.data = data;
}
public void run()
{
// Do some stuff with the data.
}
}
因此,我正在做一些并行编程,并且有一个创建大量任务的方法。这些任务共享它们将要操作的数据,但是我在为每个任务提供对数据的引用时遇到问题。问题是,当序列化任务时,将为每个任务复制数据。现在,在这个任务类中,我可以对数据进行静态引用,以便仅将其存储一次,但是在任务类的上下文中这样做实际上没有多大意义。我的想法是将对象作为静态存储在另一个外部类中,并让任务从该类中请求该对象。这可以在发送任务之前完成,可能是在上面发布的示例中的计算方法中完成了。您认为这合适吗?任何人都可以提供关于建议构想的其他替代解决方案或技巧吗?谢谢!
最佳答案
您能否进一步说明您所处的这种序列化情况? Task
如何报告结果,结果如何去向-他们会修改Data
吗?它们产生一些输出吗?是否所有任务都需要访问所有Data
?是否有任何Task
写入相同的ObjectOutputStream
?
抽象来说,我想我可以看到两类解决方案。
如果Task
不需要全部访问所有Data
,我将尝试仅给每个Task
所需的数据。
如果他们都需要所有这些内容,那么我将让它包含某种可用于获取数据的ID,而不是让Task
本身不包含Data
。我不确定如何只将Data
的一个副本转移到Task
可以运行的每个位置,并赋予Task
访问权限,但我不确定是否要更好地了解整体情况。但是我建议尝试单独管理Data
。