gpt4 book ai didi

java - hibernate 一个iPOJO组件,全部禁用

转载 作者:行者123 更新时间:2023-12-01 12:15:29 26 4
gpt4 key购买 nike

我有一个与 iPOJO 相关的简单问题。

当组件 iPOJO hibernate 时,所有剩余组件也将禁用,尽管它们之间不存在依赖关系。为什么?这是一个例子:

组件 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 秒内处于 hibernate 状态。在这5秒内,我无法单击“frame2”组件的“打印机2”。

最佳答案

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

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

关于java - hibernate 一个iPOJO组件,全部禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27039926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com