java-swingworker

来源:互联网 发布:紫鸟亚马逊数据魔方 编辑:程序博客网 时间:2024/05/21 15:00
原来还有这个东西哇,之前一直以为如果做耗时的操作,要写成
SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub}});

然后里面写成耗时的操作,然后改变界面,如果很耗时,还会多嵌套一层Thread。

现在,这个东西可以做同样的事情,而且似乎更好用诶。这玩意是1.6才开始有的,不过1.8都出来了,落伍啊~~~还在用thread.stop的说。

new SwingWorker<Void,String>(){@Overrideprotected Void doInBackground() throws Exception {// TODO Auto-generated method stubreturn null;}};
再摘抄一段此类的说明文档中的示例代码,感觉就很强大啊有木有啊。
class PrimeNumbersTask extends         SwingWorker<List<Integer>, Integer> {     PrimeNumbersTask(JTextArea textArea, int numbersToFind) {         //initialize     }     @Override     public List<Integer> doInBackground() {         while (! enough && ! isCancelled()) {                 number = nextPrimeNumber();                 publish(number);                 setProgress(100 * numbers.size() / numbersToFind);             }         }         return numbers;     }     @Override     protected void process(List<Integer> chunks) {         for (int number : chunks) {             textArea.append(number + "\n");         }     } }

但是按照里面excute()调用的方法来看,只不过是他通过代码托管了一个Thread而已

/**     * returns workersExecutorService.     *     * returns the service stored in the appContext or creates it if     * necessary.     *     * @return ExecutorService for the {@code SwingWorkers}     */    private static synchronized ExecutorService getWorkersExecutorService() {        final AppContext appContext = AppContext.getAppContext();        ExecutorService executorService =            (ExecutorService) appContext.get(SwingWorker.class);        if (executorService == null) {            //this creates daemon threads.            ThreadFactory threadFactory =                new ThreadFactory() {                    final ThreadFactory defaultFactory =                        Executors.defaultThreadFactory();                    public Thread newThread(final Runnable r) {                        Thread thread =                            defaultFactory.newThread(r);                        thread.setName("SwingWorker-"                            + thread.getName());                        thread.setDaemon(true);                        return thread;                    }                };            executorService =                new ThreadPoolExecutor(MAX_WORKER_THREADS, MAX_WORKER_THREADS,                                       10L, TimeUnit.MINUTES,                                       new LinkedBlockingQueue<Runnable>(),                                       threadFactory);            appContext.put(SwingWorker.class, executorService);            // Don't use ShutdownHook here as it's not enough. We should track            // AppContext disposal instead of JVM shutdown, see 6799345 for details            final ExecutorService es = executorService;            appContext.addPropertyChangeListener(AppContext.DISPOSED_PROPERTY_NAME,                new PropertyChangeListener() {                    @Override                    public void propertyChange(PropertyChangeEvent pce) {                        boolean disposed = (Boolean)pce.getNewValue();                        if (disposed) {                            final WeakReference<ExecutorService> executorServiceRef =                                new WeakReference<ExecutorService>(es);                            final ExecutorService executorService =                                executorServiceRef.get();                            if (executorService != null) {                                AccessController.doPrivileged(                                    new PrivilegedAction<Void>() {                                        public Void run() {                                            executorService.shutdown();                                            return null;                                        }                                    }                                );                            }                        }                    }                }            );        }        return executorService;    }

然后里面还有来回的调用,我觉得不需要深究了,只要知道这个方法比较好用,并且可以得到进度(getProgress())可以取消(cancel()),可以查看是否完成(isDone())以及查看是否取消了(isCalcelled())就足够了。

0 0
原创粉丝点击