【问题标题】:How to use two swing worker instances?如何使用两个摇摆工作者实例?
【发布时间】:2014-11-09 12:33:03
【问题描述】:

我已经创建了SwingWorker 实例并将其安排在worker thread(tAccess = new TimeAccess()).execute()) 这个实例中以访问时间。但我需要另一个摆动工作者实例来持续访问数据库。这该怎么做?

// when execute both instances ,sometimes GUI become unresponsive. 

tAccess = new TimeAccess()).execute(); 
dAccess = new DataAccess()).execute();

代码:

public class DataAccess extends SwingWorker<Void, ArrayList<TimeTable>> {

    @Override
    protected Void doInBackground() throws SQLException, ClassNotFoundException {
        int timeRun = 0;
        ArrayList<TimeTable> timeList = null;
        while (timeRun == 0) {
            timeList = TimeTableController.viewTimeTable();
            publish(timeList);

        }
        return null;
    }

    @Override
    protected void process(List<ArrayList<TimeTable>> dataList) {
        ArrayList<TimeTable> timeArray = dataList.get(dataList.size() - 1);
        DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
        int x = 0;
        for (TimeTable time : timeArray) {
            dtm.setValueAt(time.getCity() + "          " + time.getTime(), x, 0);
            dtm.setValueAt(time.getCity() + "          " + time.getTime(), x, 1);
            x = x + 1;
           // System.out.println(x);
            System.out.println(javax.swing.SwingUtilities.isEventDispatchThread() + "database thread chkr");

        }

    }

}


 private class TimeAccess extends SwingWorker<Void, String> {

    @Override
    protected Void doInBackground() {
        int timeRun = 0;
        while (timeRun == 0) {
            Calendar cal = Calendar.getInstance();
            cal.getTime();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            System.out.println(sdf.format(cal.getTime()));
            String timeNow = sdf.format(cal.getTime());

            publish(timeNow);

        }
        return null;
    }

    @Override
    protected void process(List<String> timeList) {
        String time = timeList.get(timeList.size() - 1);
        clockLabel.setText(time);
        System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
    }

}

【问题讨论】:

  • 在不知道您在员工身上实际做什么的情况下,我们无法为您提供帮助。
  • 我刚刚上传了我的 2 个工人班级。

标签: java swing concurrency


【解决方案1】:

问题似乎是你在这里有一个无限循环:

while (timeRun == 0) {

调用一些方法:

TimeTableController.viewTimeTable();

我将假设此方法不会阻塞,或者任何合理的方法。所以:

  1. worker 循环,并且每秒多次调用publish;那么
  2. Publish 会获取所有数据,并且每次都会更新整个显示表。

这显然占用了 EDT 的所有时间 - 试图跟上您要求的更新。

所以,使用SwingWorker 做得很好。多想想你的逻辑。

【讨论】:

  • process 方法在 Event Dispatch Thread 上被异步调用,但为什么执行不由 EDT 管理?
  • @lahiru 我不明白这个问题。重点是 process 在 EDT 上运行,doInBackground 在工作线程上运行。调用 publish 是以线程安全的方式将对象从工作线程发布到 EDT 以供显示的方式。您发布的内容过多,导致 EDT 完全超载。
  • 是的,流程方法运行在EDT.JAVA文档中提到流程方法是异步调用的(定期发生)。那么它是如何占用 EDT 的所有时间的。
  • @lahiru 您似乎不明白“异步”的含义或“线程”的含义。如果我在t 间隔调用一些东西,这需要一些时间d &gt; t,那么你认为会发生什么?
  • 再一次,您似乎不明白这是如何工作的。 while 循环在后台线程上运行。它调用publish。 EDT 每隔一段时间收集已发布的事件并调用process。重载 EDT 的是 process 方法。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
相关资源
最近更新 更多