来自tinkergraph的多线程阅读

时间:2016-01-22 16:24:49

标签: java multithreading tinkerpop tinkergraph

当尝试从修补程序中读取多线程时,我的行为非常奇怪。我有以下情况:

Graph graph = TinkerGraph.open();
Set<Vertex> verticesAdded = randomGraph(graph);

verticesAdded是我在randomGraph(graph)进程中添加的一组顶点。一旦我有这个列表,我检查这个顶点的内部属性,并根据该属性我将顶点传递给一个线程进行一些额外的工作。我遵循的过程大致是:

public class ValidateVerticies(){
    private Set<Vertex> vertices;
    private ExecutorService executor;
    public ValidateVerticies(Set<Vertex> verticesAdded){
        vertices = verticesAdded;
        executor = Executors.newSingleThreadExecutor(); //Single just for testing purposes
    }

    public validate(){
        for(Vertex vertex: vertices){
            String prop = vertex.property("type");
            if(type.equals("1"))
                executor.submit(() -> validateRule1(vertex))
            else if(type.equals("2"))
                executor.submit(() -> validateRule2(vertex))
            else if(type.equals("n"))
                executor.submit(() -> validateRule3(vertex))
            ...
            else if(type.equals("n"))
                executor.submit(() -> validateRulen(vertex))
        }
    }
}

上面的代码完全是单线程的,但是一旦我介绍了线程池,我就会遇到各种各样的错误。包括:

  1. 顶点属性"type"不存在。
  2. 尝试访问某些顶点属性时
  3. java.lang.IndexOutOfBoundsException: Index: 0, Size: -1
  4. 验证规则在最初通过时失败。
  5. 从tinkergraph进行多线程读取时有什么微妙的东西吗?

    修改

    我会尝试简化问题: 以下作品:

    public class ValidateVerticies(){
        private Set<Vertex> vertices;
        public ValidateVerticies(Set<Vertex> verticesAdded){
            vertices = verticesAdded;
        }
    
        public validate(){
            for(Vertex vertex: vertices){
                String prop = vertex.property("type");
                if(type.equals("1"))
                    validateRule1(vertex);
                ...
                else if(type.equals("n"))
                    validateRulen(vertex);
            }
        }
    }
    

    虽然上面的多线程版本因TinkerGraph失败(同样适用于支持事务的Titan),但从图表中读取时会返回不一致的结果。

1 个答案:

答案 0 :(得分:0)

试一试。取代

String prop = vertex.property("type");

用这个

String type = vertex.value("type");

前者返回VertexProperty,而后者返回VertexProperty的value,这是我认为您正在寻找的。

至于你的#2和#3子弹,你需要提供更多细节。