从线程

时间:2017-12-01 18:56:47

标签: java multithreading

假设我想在一个线程中调用一个方法,只要某个事件发生在并行运行的线程中。我可以存储运行该线程的类的对象(比如在hashmap中),然后直接引用该对象来调用该方法吗?

例如:

Class SomeThread implements Runnable{
SomeThread(){
}

    void run(){
          //do something
    }

    void someMethod(){
        //do something else
    }
}

假设在这个类上创建了多个线程:

while(someCondition){
   SomeThread st = new SomeThread();
   Thread t = new Thread(st);
   t.start();
   hashMap.put(unique_id, st)
}

现在,让我们假设hashMap对于创建的所有线程都是可见的。我可以使用hashMap访问unique_id以获取我需要的主题的对象,然后调用st.someMethod()吗?

编辑:我从P2P网络编程的角度提问这个问题。假设一个对等体正在侦听来自其他对等体的消息,一旦它获得特定消息,我需要它将另一个标准消息发送给连接到它的所有其他对等体。在这种情况下,我可以只是同步发送此标准消息的方法吗?

2 个答案:

答案 0 :(得分:1)

它并不像这样工作:线程不拥有自己的方法。线程只不过是一个"活动序列"。

在线程对象上调用方法将在运行调用该方法的客户端代码的同一线程中运行该方法。

您应该以不同的方式执行此操作:一种通常的方法是另一个线程继续轮询某些共享数据结构的内容。通常你会使用某种队列。

线程A将某种命令放入队列中,线程B在某些时候对此作出反应。

但是请注意:这样的设计在某种程度上是"过去十年"。现在你宁愿避免使用裸线程和它们之间的低级别交互。相反,你会研究高级抽象 - 例如ExecutorService,Futures,......

答案 1 :(得分:1)

在任何线程中运行的代码都可以在它具有引用的任何对象上调用任何可访问的方法。当然,该方法在调用它的线程上运行。

但是必须正确地同步访问相同共享对象的多个线程,否则结果程序的行为没有明确定义,并且实际上可能表现出各种令人惊讶和反直觉的特征。同步是一个非常广泛的主题,无法在此完全解决,但在您的示例中,我建议至少

  1. 使用java.util.concurrent.ConcurrentHashMap代替java.util.HashMap

  2. 确保SomeThread.someMethod()对共享状态的所有访问都已正确同步,可能是通过标记整个方法synchronized