• 生成deamon线程的executor


    参考SwingWorker代码:

       /**
         * 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;
        }
    ——————————————————————————————————
    傲轩游戏网
  • 相关阅读:
    [转] css3变形属性transform
    [转] ReactJS之JSX语法
    [转] 那些在使用webpack时踩过的坑
    [转] jQuery的deferred对象详解
    [转] Webpack-CommonsChunkPlugin
    [转] 用webpack的CommonsChunkPlugin提取公共代码的3种方式
    Refs & DOM
    [转] Webpack的devtool和source maps
    [转] 编译输出文件的区别
    GDB && QString
  • 原文地址:https://www.cnblogs.com/cuizhf/p/2301143.html
Copyright © 2020-2023  润新知