使用简单的object.wait时阻止Web应用程序

时间:2013-12-10 08:38:40

标签: java multithreading vaadin

我正在窗口上使用锁定对象,我想阻止: 当用户单击“单击我”按钮时,我想打开一个包含日历的窗口,用户应该在日历中选择一个日期。用户应该被阻止,直到他选择日期为止,所以我写了这个:

    Button button = new Button("Click Me");
    button.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {
synchronized (Lock.getInstance()) {
          DateChooser dateChooser = new DateChooser(new com.kopiright.xkopi.lib.type.Date(2013, 12, 9));



          UI.getCurrent().addWindow(dateChooser);


              System.out.println("!!!!!!!!!!!I'm waiting ...");
            try {
              Lock.getInstance().wait();
              System.out.println("I'm waiting ...");
            } catch (InterruptedException e) {
              e.printStackTrace();
            }

         }

        }

      });

当用户单击按钮时,窗口未显示,页面无限等待。 问题是我阻塞了应用程序的主要类。 那么如何防止这种情况。 我应该创建一个显示DateChooser窗口的单独线程。

这是通知电话: 在DateChooser类中我写了这个:

@Override
public void valueChange(ValueChangeEvent event) {
  synchronized(Lock.getInstance()) {
  String date = String.valueOf(event.getProperty().getValue());
  Calendar  cal = Calendar.getInstance(Locale.FRANCE);
  cal.setTime((java.util.Date) event.getProperty().getValue());

  setSelectedDate(new NotNullDate(cal));
  this.close();
  Lock.getInstance().notify();
  }
 }

这是Lock类

public class Lock
 {
  private static Lock lockInstance;

public static  Lock getInstance()
{
 if (lockInstance == null)
   {lockInstance = new Lock();
    System.out.println("Creating a lock instance ...");}
    return lockInstance;
  }

 }

2 个答案:

答案 0 :(得分:2)

你误解了两个wait概念:GUI块和同步。

在您的情况下,您不需要同步任何内容,只需在用户单击按钮时找到禁用开启者GUI窗口的方法,并显示新窗口。< / p>

答案 1 :(得分:2)

在vaadin中,http请求 - 响应的相同Web原则适用。当用户单击按钮时,发出请求,以便显示窗口,来自服务器的响应必须完成。但是当线程被阻止时,这不会发生。

此外,要实现您所描述的内容,您不需要线程控制。只需在模态窗口上显示日历,从窗口中删除关闭控件,只关闭带有dateChooser对象的值更改侦听器的窗口。

假设DateChooser是一个vaadin窗口,你可以调用setModal(true);使其成为模态。另请查看vaadin https://vaadin.com/book/vaadin7/-/page/layout.sub-window.html的书。