Java:如何比较不同线程中的对象

时间:2011-07-01 00:28:53

标签: java thread-safety

我有来自客户端的服务器监听数据。一旦客户端发送数据,它将进入一个线程。因此,每个线程都有一个数据。 revFeaturePoints是服务器从客户端接收的数据。

每个revFeaturePoints都有一个浮点数组,我想计算不同线程中不同revFeaturePoints之间的欧氏距离?

我不知道如何让一个线程访问其他线程中的另一个revFeaturePoints?

以下是代码:

public class MyServer {

public static void main(String[] args) throws IOException{
    ServerSocket serverSocket = null;

    //bind a serverSocket to the port and listen
    try{
        serverSocket = new ServerSocket(8888);
        System.out.println("Listening: 8888");
    }catch(IOException e){
        e.printStackTrace();
    }

    while(true)
        new MyServerThread(serverSocket.accept()).start();
}   
}

public class MyServerThread  extends Thread{
//Create a socket for each client
private Socket socket = null;
private ObjectInputStream dataInputStream = null;
private ObjectOutputStream dataOutputStream = null;
private ArrayList<FeaturePointList> revFeaturePoints = null;

//constructor
public MyServerThread(Socket socket){
    super("MyServerThread");
    this.socket = socket;
}

@SuppressWarnings("unchecked")
public void run(){
    try{            
        dataOutputStream = new ObjectOutputStream(socket.getOutputStream());
        dataInputStream = new ObjectInputStream(socket.getInputStream());
        System.out.println("ip: "+ socket.getInetAddress());
        revFeaturePoints = (ArrayList<FeaturePointList>) dataInputStream.readObject();          

    }catch(IOException e){
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    finally{
        if(socket!=null){
            try{
                socket.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
        if(dataInputStream!=null){
            try{
                dataInputStream.close();
            }catch(IOException e){
                e.printStackTrace();
            }               
        }
        if(dataOutputStream!=null){
            try{
                dataOutputStream.close();
            }catch(IOException e){
                e.printStackTrace();
            }               
        }

    }
}

}

5 个答案:

答案 0 :(得分:1)

如果您的MyServerThread课程将数据存储到某个字段中,则可以从MyServerThread的多个实例访问该字段。

答案 1 :(得分:1)

一种简单的方法是在MyServerThread中放置一个返回数据的同步方法。

另一种方法是使用BlockingQueue并将数据结果放入队列中,并将结果作为生产者 - 消费者模式。有关这样做的方法,请参阅here

答案 2 :(得分:1)

您可以使用共享结构和正确的同步在线程之间共享数据。例如,您可以在ConcurrentHashMap<'threadname', data>中有MyServerThread,其中每个线程放置其数据并在其他线程中搜索数据。

那就是说,你应该评估你的架构。如果N个线程必须检查其他N-1线程正在对数据执行的操作,那么您正在准备性能灾难的配方。您可能想要做的是在您的体系结构中创建一些分层,其中许多ServerThreads正在收集请求并将它们放在并发共享结构中(例如队列)。然后另一组工作人员正在比较和处理数据并在协作系统中产生结果。看看producer-consumer pattern

答案 3 :(得分:1)

[真的是评论,但不适合;)

maasg的答案在一般意义上是非常正确的,但我相信你现在正在考虑设计困难而不是Java线程实现本身。

您的服务器(按原样)在每个连接请求上触发一次性线程,此线程只是从客户端读取一个对象,然后关闭连接。传递的对象放在(服务器线程)实例作用域对象(退出run()后正确地进行垃圾回收)。

完全不清楚 - 因此给人的印象是这是一个设计问题 - 你如何确定要比较哪两个线程,或者就此而言,是什么保证你有(总是)2个并发线程到首先。

逻辑上,您显然在服务器线程与域中某些有意义的事物之间存在某些特定于域的关联。这种关系需要体现在代码中,但首先我们需要了解这种区别和关系是什么。

答案 4 :(得分:-1)

对象不是'在不同的线程中'。对象是其他不同对象的成员,通常通过'get'方法引用。完全忘记线程问题,这是无关紧要的。您只想将对象A的成员与对象B的成员进行比较。这只是照常营业。