[英]java concurrency condition opportune usage
在应用程序中,当按下“创建”按钮时,会弹出另一个子窗体。主窗体将等待直到子窗体被填充,然后单击子窗体中的“提交”按钮,此后,它将获取输入到子窗体中的数据以进行进一步处理。
我面临的问题是程序在单击“创建”按钮后挂起,尽管显示了子窗体。
waitTillFilled是应用程序中使用的条件。
动作监听器的主要形式
if(e.getSource()==create)
{ try
{
lock.lock();
try
{
model=(DefaultTableModel)table.getModel();
Form newForm=new Form();
System.out.println("Waiting to fill the sub form");
waitTillFilled.await();
System.out.println("Waiting done....");
Vector<String> newData=newForm.returnFields();
System.out.println("added row is "+newData);
model.addRow(newData);
System.out.println("Table created"+data);
}
finally
{
lock.unlock();
}
}
catch (InterruptedException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
Thread.currentThread().interrupt();
}
}
子表单中的动作侦听器
if(e.getSource()==submit)
{
String n,p,em;
n=name.getText();
p=phone.getText();
em=email.getText();
rowData=new Vector<String>();
rowData.add(n);
rowData.add(em);
rowData.add(p);
System.out.println("added row is "+rowData);
waitTillFilled.signal();
}
您正在尝试在这里重新发明轮子。 您应该只使用JOptionPane
创建一个模式对话框,该对话框返回一些用户输入的输入。 参见http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
将await()从UI线程传输到blockingMethod(),该方法会生成一个新线程,以等待发出信号时从子表单中收集数据。
Runnable r2=new Runnable(){
@Override
public void run()
{
try
{ lock.lock();
System.out.println("Lock acquired in blockingMethod");
System.out.println("about to wait");
waitTillFilled.await();
System.out.println("Waiting done....");
Vector<String> newData=returnFields();
System.out.println("added row is "+newData);
model.addRow(newData);//add row
System.out.println("Table created"+data);
//invoke setName after reaquiring lock
lock.unlock();
System.out.println("Lock released in blockingMethod");
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}};
子表单中的actionListener被编辑为
lock.lock();
System.out.println("Lock acquired in actionPerformed");
try
{
System.out.println("Waiting to fill the sub form");
model=(DefaultTableModel)table.getModel();
Form newForm=new Form();
lock.unlock();
blockingMethod();
}
finally
{
lock.unlock();
System.out.println("Lock released in actionPerformed");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.