Java 如何使用两个swing worker实例?

Java 如何使用两个swing worker实例?,java,swing,concurrency,Java,Swing,Concurrency,我已经创建了SwingWorker实例,并在worker线程(tAccess=new TimeAccess())中计划了它。execute())此实例可以访问时间。但我需要另一个swing worker实例来持续访问数据库。如何做到这一点 // when execute both instances ,sometimes GUI become unresponsive. tAccess = new TimeAccess()).execute(); dAccess = new DataAcc

我已经创建了
SwingWorker
实例,并在worker
线程(tAccess=new TimeAccess())中计划了它。execute())
此实例可以访问时间。但我需要另一个swing worker实例来持续访问数据库。如何做到这一点

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

tAccess = new TimeAccess()).execute(); 
dAccess = new DataAccess()).execute();
代码:

公共类数据访问扩展SwingWorker{
@凌驾
受保护的Void doInBackground()引发SQLException,ClassNotFoundException{
int timeRun=0;
ArrayList timeList=null;
while(timeRun==0){
timeList=TimeTableController.ViewTimeline();
出版(时间表);
}
返回null;
}
@凌驾
受保护的无效进程(列表数据列表){
ArrayList timeArray=dataList.get(dataList.size()-1);
DefaultTableModel dtm=(DefaultTableModel)jTable1.getModel();
int x=0;
for(时间表时间:timeArray){
dtm.setValueAt(time.getCity()+“”+time.getTime(),x,0);
dtm.setValueAt(time.getCity()+“”+time.getTime(),x,1);
x=x+1;
//系统输出println(x);
System.out.println(javax.swing.SwingUtilities.isEventDispatchThread()+“数据库线程chkr”);
}
}
}
私有类TimeAccess扩展SwingWorker{
@凌驾
受保护的Void doInBackground(){
int timeRun=0;
while(timeRun==0){
Calendar cal=Calendar.getInstance();
cal.getTime();
SimpleDataFormat sdf=新的SimpleDataFormat(“HH:mm:ss”);
System.out.println(sdf.format(cal.getTime());
字符串timeNow=sdf.format(cal.getTime());
出版(timeNow);
}
返回null;
}
@凌驾
受保护的无效流程(列表时间列表){
字符串时间=timeList.get(timeList.size()-1);
clockLabel.setText(时间);
System.out.println(javax.swing.SwingUtilities.isEventDispatchThread());
}
}

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

while (timeRun == 0) {
这需要一些方法:

TimeTableController.viewTimeTable();
我将假设这个方法不会阻塞,或者任何合理的东西。因此:

  • worker循环,每秒调用
    publish
    ;然后
  • Publish会获取所有数据,并且每次都会更新整个显示表
  • 这显然占用了EDT的所有时间——试图跟上您要求它做的更新


    因此,使用
    SwingWorker
    做得很好。多想想你的逻辑。

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

    while (timeRun == 0) {
    
    这需要一些方法:

    TimeTableController.viewTimeTable();
    
    我将假设这个方法不会阻塞,或者任何合理的东西。因此:

  • worker循环,每秒调用
    publish
    ;然后
  • Publish会获取所有数据,并且每次都会更新整个显示表
  • 这显然占用了EDT的所有时间——试图跟上您要求它做的更新


    因此,使用
    SwingWorker
    做得很好。多想想你的逻辑。

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

    while (timeRun == 0) {
    
    这需要一些方法:

    TimeTableController.viewTimeTable();
    
    我将假设这个方法不会阻塞,或者任何合理的东西。因此:

  • worker循环,每秒调用
    publish
    ;然后
  • Publish会获取所有数据,并且每次都会更新整个显示表
  • 这显然占用了EDT的所有时间——试图跟上您要求它做的更新


    因此,使用
    SwingWorker
    做得很好。多想想你的逻辑。

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

    while (timeRun == 0) {
    
    这需要一些方法:

    TimeTableController.viewTimeTable();
    
    我将假设这个方法不会阻塞,或者任何合理的东西。因此:

  • worker循环,每秒调用
    publish
    ;然后
  • Publish会获取所有数据,并且每次都会更新整个显示表
  • 这显然占用了EDT的所有时间——试图跟上您要求它做的更新



    因此,使用
    SwingWorker
    做得很好。仔细想想你的逻辑。

    如果不知道你在员工中实际做了什么,我们就无法帮助你。我刚刚上传了我的两个员工类。如果不知道你在员工中实际做了什么,我们就无法帮助你。我刚刚上传了我的两个员工类。如果不知道你在员工中实际做了什么,我们帮不了你。我刚刚上传了我的2个工人类。在不知道你在工人中实际做了什么的情况下,我们帮不了你。我刚刚上传了我的2个工人类。进程方法在事件调度线程上异步调用,但为什么执行不由EDT管理?@lahiru我不理解这个问题。关键是
    process
    在EDT上运行,
    doInBackground
    在工作线程上运行。调用
    publish
    是以线程安全的方式将对象从工作线程发布到EDT以供显示的方法。您发布的EDT太多并且完全超载。是的,在EDT上运行process方法。JAVA文档提到process方法是异步调用的(以固定的间隔发生)。所以它是如何花费所有EDT的时间的。@lahiru你似乎不明白什么是“异步”或者什么是“线程”。如果我在间隔时间
    t
    调用某个需要时间
    d>t
    的东西,那么您认为会发生什么?再一次,您似乎不理解这是如何工作的。
    while
    循环在后台线程上运行。它调用
    publish
    。EDT每隔一段时间收集已发布的事件并调用
    进程
    。是
    process
    方法重载了EDT。在事件调度线程上异步调用process方法,但为什么EDT不能管理执行?@lahiru