有几个类似的问题。但我的问题是基本的,而不是针对问题。我想要一个如何的基本代码示例。这是我正在处理的代码
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
}
});
}
答案 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)
你可以在线程之间共享任何你想要的东西:只要一个线程中执行的方法有一个对象的引用,而另一个线程中的另一个方法有一个对同一个对象的引用,那么这个对象在两者之间共享线程。
在这种情况下,难点是确保在共享对象上完成的每个操作都是线程安全的(即不会将对象置于异常状态,并返回正确的值)。不可变对象始终是线程安全的。其他通常需要同步才能是线程安全的。