0

我有一个关于 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”按钮。“frame1”组件在 5 秒内处于休眠状态。在这 5 秒内,我无法单击“frame2”组件的“打印机 2”。

4

1 回答 1

1

这不是 ipojo 问题。Swing 使用一个线程(并且只有一个线程)来调度诸如点击之类的事件。当您单击第一个按钮时,swingactionPerformed会在此线程中运行您的。此方法使您的线程休眠 5 秒。这意味着负责事件处理的线程在这段时间内不能做任何事情。这就是为什么您的程序不响应您的第二次点击的原因。

每当您在摇摆(以及osgi)中进行长时间计算时,通常最好在单独的线程中运行代码以避免阻塞执行(这里您有一个无用的Thread.sleep()但我想您可能有一个http请求或任何可能需要很长时间的东西)。您可能应该使用执行器服务或类似的东西。

于 2014-11-20T18:01:58.853 回答