繁体   English   中英

Java并发条件的适当用法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM