编程语言
首页 > 编程语言> > java-SwingWorker线程可重用性

java-SwingWorker线程可重用性

作者:互联网

我不知道重复执行某些任务时Java SwingWorker及其线程池如何工作.这是准备复制粘贴的问题的SSCCE:

    package com.cgi.havrlantr.swingworkerexample;

    import java.awt.*;
    import javax.swing.*;

    public class Main extends JFrame {

        public static void main(String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Main().setVisible(true);
                }
            });
        }

        public Main() {
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setSize(new Dimension(100,100));
            JButton btn = new JButton("Say Hello");
            add(btn);
            btn.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnPressed(evt);
                }
            });
        }

        private void btnPressed(AWTEvent e) {
            SayHelloSwingWorker worker = new SayHelloSwingWorker();
            worker.execute();
        }

        private class SayHelloSwingWorker extends SwingWorker<Integer, Integer> {

            protected Integer doInBackground() throws Exception {
                System.out.println("Hello from thread " + Thread.currentThread().getName());
                return 0;
            }
        }

    }

我想问以下问题.每次我在worker的新实例上调用execute()时(在按下按钮后),都会在SwingWorker线程池中创建一个新线程,最多创建10个线程.超出此限制后,线程将按我的期望进行重用.因为新的工作程序是在前一个工作程序完成之后按顺序创建的,所以我不明白为什么不立即重用第一个线程,因为前一个工作程序已经完成了工作.假设只能有一个单线程,这在当时可以完成一些工作.我希望线程池仅创建一个线程,足以处理所有任务.这是通常的行为吗?还是有什么问题会导致第一个线程的可重用性遭到拒绝并迫使线程池创建另一个线程?

如果正常,我认为浪费时间来创建不必要的线程和内存以保持线程就绪.我可以以某种方式避免它吗?我可以强迫SwingWorker的池中只有一个线程吗? -我认为不行,因为据我所知,线程数是恒定的并且取决于Java实现.

任务完成后,我可以让SwingWorker完成线程吗? (在done()方法中调用this.cancel()无效)

这是我的实际工作人员的代码,以防万一某些依赖关系可能导致问题.

public class MapWorker extends SwingWorker<Long, Object> {
    @Override
    protected Long doInBackground() throws Exception{
        try {
                long requestId = handleAction();
                return requestId;
    }catch(Exception e){
        logger.error( "Exception when running map worker thread.", e);
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                requestFinished();
            }
        });
        MapUtils.showFatalError(e);
    }

    return -1l;
    }

    @Override
    protected void done(){
        try{
            requestId  = get();
            logger.info("Returned from map request call, ID: {}", Long.toString(requestId));
        }catch(InterruptedException e){
            logger.error( "Done interrupted - wierd!", e);
        }catch(ExecutionException e){
            logger.error( "Exception in execution of worker thread.", e);
        }
    }

在handleAction()方法中,创建了一个带有某些阻塞调用的新线程,并返回了线程ID,这不应是任何奇怪的事情.不要问我为什么,这不是我的代码.

标签:swingworker,multithreading,swing,java
来源: https://codeday.me/bug/20191122/2062635.html