我有一个关于iPOJO的简单问题。
当一个组件iPOJO休眠时,所有剩余的组件也会被禁用,尽管它们之间没有依赖关系。为什么?这是一个例子:
组件1:
@Component(name="frame1", immediate=true)
@Instantiate(name="iframe1")
public class Frame1 implements Runnable{
String str;
Label lb = new Label();
TextField tf = new TextField();
Frame fr;
public void run() {
fr = new Frame("Frame1");
fr.setLayout(new BorderLayout());
fr.setSize(230, 200);
fr.setLocation(900,250);
fr.add(tf, BorderLayout.NORTH);
lb.setText("Result");
fr.add(lb, BorderLayout.CENTER);
Panel pn = new Panel();
fr.add(pn, BorderLayout.SOUTH);
pn.setLayout(new GridLayout(1,4,1,1));
Button bt = new Button("Printer 1");
pn.add(bt);
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
System.out.println("start sleep");
Thread.sleep(5000);
System.out.println("stop sleep");
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
fr.setVisible(true);
}
@Validate
public void start() {
//this.delayService = dls;
Thread th = new Thread(this);
th.start();
}
@Invalidate
public void stop() {
System.out.println("stop");
fr.setVisible(false);
}
}
组件2:
@Component(name="frame2", immediate=true)
@Instantiate(name="iframe2")
public class Frame2 implements Runnable{
String str;
Label lb = new Label();
TextField tf = new TextField();
Frame fr;
public void run() {
System.out.println("start component 2");
fr = new Frame("Frame2");
fr.setLayout(new BorderLayout());
fr.setSize(230, 200);
fr.setLocation(900,250);
fr.add(tf, BorderLayout.NORTH);
lb.setText("Result");
fr.add(lb, BorderLayout.CENTER);
Panel pn = new Panel();
fr.add(pn, BorderLayout.SOUTH);
pn.setLayout(new GridLayout(1,4,1,1));
Button bt = new Button("Printer 2");
pn.add(bt);
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("in 2");
}
});
fr.setVisible(true);
}
@Validate
public void start() throws Exception {
//this.delayService = dls;
System.out.println("start thread 2");
Thread th = new Thread(this);
th.start();
//fr.setVisible(true);
}
@Invalidate
public void stop() throws Exception {
System.out.println("stop");
fr.setVisible(false);
}
}
部署并运行两个组件。有两个独立的组件。但我点击"打印机1"按钮。 "帧1"组件在5s内睡觉。在这5秒钟内,我无法点击"打印机2" " frame2"成分
答案 0 :(得分:1)
这不是ipojo问题。 Swing使用一个线程(并且只有一个线程)来分派点击等事件。当您单击第一个按钮时,swing会在此主题中运行actionPerformed
。此方法使您的线程休眠5秒钟。这意味着负责事件处理的线程在此期间无法执行任何操作。这就是为什么您的程序不响应您的第二次点击。
每当你在swing(以及osgi)中进行长计算时,通常最好在单独的线程中运行代码以避免阻塞执行(这里你有一个无用的Thread.sleep()
但是我想你可能有一个http请求或任何可能需要很长时间的事情)。你应该使用executor service或类似的东西。