题记
刚才在读项目中的各种源码,发现了一个没见过的线程池,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后,这个地方就有确定的答案了