static妙用

169 阅读1分钟

题记

刚才在读项目中的各种源码,发现了一个没见过的线程池,GlobalThreadPool,很想知道他是如何初始化的,翻了翻发现只有一个static块,很好奇,代码稍作修改在本地跑了一下,证明了我的猜想。

static 原来是只会执行一次啊!想想以前的代码有些初始化真的写的重了。

例子

这是GlobalThreadPool,我在他基础上略微修改,为了方便跑起来我看现象

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;

public class GlobalThreadPool {
    private static ExecutorService executor;

    private GlobalThreadPool() {
    }

    public static synchronized void init() {
        if (null != executor) {
            executor.shutdownNow();
        }

        executor = new ForkJoinPool();
    }

    public static synchronized void shutdown(boolean isNow) {
        if (null != executor) {
            if (isNow) {
                executor.shutdownNow();
            } else {
                executor.shutdown();
            }
        }

    }

    public static ExecutorService getExecutor() {
        return executor;
    }

    public static void execute(Runnable runnable) {
        try {
            executor.execute(runnable);
        } catch (Exception var2) {
            throw new RuntimeException( "Exception when running task!");
        }
    }

    public static <T> Future<T> submit(Callable<T> task) {
        return executor.submit(task);
    }

    public static Future<?> submit(Runnable runnable) {
        return executor.submit(runnable);
    }

    static {
        System.out.println("进入初始化");
        init();
    }
}

另起一个类进行调用

public class HelpMain {
    public static void main(String[] args) {
        GlobalThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("I love you baby");
            }
        });

        GlobalThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("I love you baby");
            }
        });
    }
}

执行结果

进入初始化
I love you baby
I love you baby

Process finished with exit code 0

是吧!只会进入static块中一次,为此我专门去查了查原因。

总结

他在该类被调用的时候,就会将static修饰的类或方法被放在JVM中,据说是在方法区

害怕说的不对,因为网上的资料也是五花八门的,所以先打上删除线,等系统学一遍JVM后,这个地方就有确定的答案了