【问题标题】:Sleep a iPOJO component, all disable休眠一个 iPOJO 组件,全部禁用
【发布时间】:2014-11-20 12:42:59
【问题描述】:

我有一个关于 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”组件的“Printer 2”。

【问题讨论】:

    标签: java ipojo


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多