首先,这是一个激励人的示例:

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

10-06 07:15
查看更多