Classloader和线程
2012-07-26 19:53:30 来源:WEB开发网核心提示: Java中所有的类都是由classloader进行加载的,通常情况下我们不需要显式的去使用类加载器,Classloader和线程,但是对于一个web容器而言,通常拥有多个classloader,这个就是类加载器隔离的关键,我们可以很容易写一小段代码来证实:下面这段代码运行后输出是,我们知道,每个classloade
Java中所有的类都是由classloader进行加载的。
通常情况下我们不需要显式的去使用类加载器。
但是对于一个web容器而言,通常拥有多个classloader,我们知道,每个classloader所加载的类彼此都是不可见的。比如一个servlet程序,它使用了WEB-INF/lib下面的log4j,而tomcat本身也有一套logj的包。显然对于servlet而言,它是看不到tomcat的log4j,反之亦然。
这一点如何做到?
答案就是线程自身的contextClassLoader。我们知道java代码总是在某个线程中执行的,这个线程所需要的类,则是由它自己的contextClassLoader所加载;当一个线程开启了一个子线程,则子线程会隐式的继承父线程的classloader。这个就是类加载器隔离的关键。
我们可以很容易写一小段代码来证实:
下面这段代码运行后输出是,
main_cl:sun.misc.Launcher$AppClassLoader@1a46e30
MainProc:org.kevx.MyClassLoader@1fb8ee3
SubProc:org.kevx.MyClassLoader@1fb8ee3
证明了上面这个结论。
class MainProc implements Runnable {
@Override
public void run() {
out.println( "MainProc:" + Thread.currentThread().getContextClassLoader());
new Thread( new SubProc()).start();
}
}
class SubProc implements Runnable {
@Override
public void run() {
out.println( "SubProc:" + Thread.currentThread().getContextClassLoader());
}
}
class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls) {
super(urls);
}
}
public class AsciiUtil {
public static void main(String[] args) throws Exception {
out.println( "main_cl:" + Thread.currentThread().getContextClassLoader());
URL url = new URL( "file:///c:/Program Files/Java/jre6/lib" );
MyClassLoader mcl = new MyClassLoader( new URL[]{url});
Thread. currentThread().setContextClassLoader(mcl);
new Thread( new MainProc()).start();
}
}
Tags:Classloader 线程
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接
