如何在线程之间共享对象?

时间:2011-02-06 16:59:22

标签: java

有几个类似的问题。但我的问题是基本的,而不是针对问题。我想要一个如何的基本代码示例。这是我正在处理的代码

         Controller c = new Controller(....) ;
         if(.... ) //manager
    {
        if (jRadioButton1.isSelected())
        {
          java.awt.EventQueue.invokeLater(new Runnable() {
       public void run() {
            new MyGUI().setVisible(true);//I want to pass object c to MyGUI Thread
        }
    });
        }

5 个答案:

答案 0 :(得分:3)

您不需要做任何特殊的事情来在线程之间共享对象,任何线程都可以访问任何对象。

但是,如果要从多个线程安全地访问对象,则需要小心。对象的方法必须是线程安全的,或者您需要同步访问到对象。

希望这有帮助。

答案 1 :(得分:1)

它可以像传递Runnables一样简单:

final Object o = new Object();
Runnable r = new Runnable() {
  public void run() {
    System.out.println(Thread.currentThread().getName() + ": " + o);
  }
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();

当然,如果这些线程同时修改共享对象的属性,则有一些重要的考虑因素。

在您的代码示例中,您只需更改MyGUI构造函数以将Controller对象作为参数,或者提供实例setter方法。

答案 2 :(得分:1)

在您的示例中,将Controller c设为final,然后通过构造函数或setter方法将其传递到GUI中。例如:

     final Controller c = new Controller(....) ;
     if(.... ) //manager
{
    if (jRadioButton1.isSelected())
    {
      java.awt.EventQueue.invokeLater(new Runnable() {
   public void run() {
        MyGUI gui = new MyGUI(c);//pass object c to MyGUI Thread via constructor
        // gui.setController(c); //or you could have a setter method
        gui.setVisible(true);
    }

答案 3 :(得分:1)

好的,基本上可以回答它。

请注意更改最终和MyGUI的构造函数

     final Controller c = new Controller(....) ;
     if(.... ) //manager
     {
          if (jRadioButton1.isSelected())
          {
             java.awt.EventQueue.invokeLater(new Runnable() {
                 public void run() {                        
                    new MyGUI(c).setVisible(true);//I want to pass object c to MyGUI Thread
             }
          });
     }

     class MyGUI
     { 
           private Controller _controller;
           public MyGui(Controller c)
           {
                _controller = c;
           }
     }

答案 4 :(得分:0)

你可以在线程之间共享任何你想要的东西:只要一个线程中执行的方法有一个对象的引用,而另一个线程中的另一个方法有一个对同一个对象的引用,那么这个对象在两者之间共享线程。

在这种情况下,难点是确保在共享对象上完成的每个操作都是线程安全的(即不会将对象置于异常状态,并返回正确的值)。不可变对象始终是线程安全的。其他通常需要同步才能是线程安全的。