Java虚拟机类加载机制
Java 类加载过程有7个步骤: 加载(Loading) ,验证(Verfication), 准备(Preparation),解析(Resolution),初始化(Initialization) ,使用(Using),卸载(Unloading)。
每个步骤干那些事情,如下:
加载(Loading): 1.通过一个类的全限定名来定义此类的二进制字节流。此此节流不一定是从一个.class文件中获取,可以通过网络,数据库,动态生产等
2.将字节流所代码的静态存储结构,转换为方法区的数据结构
3.在内存中生成java.lang.Class对象,作为方法区的这个类的各种数据访问入口。
验证(Verfiication):1.文件格式校验 ,验证字节是否符合Class文件规范
2.进行语意分析,是否符合Java语言规范。
3.字节码验证,确定程序语意是否合法
4.符号引用是否合法
准备(Preparation): 1. 为类变量分配内存,并设置初始值阶段。这些变量所使用的内存都将在方法区分配,内存分配的包含方法区变量。 static 静态变量
解析(Resolution):解析主要针对类或接口,字段,类方法,接口方法,方法类型,方法调用,client方法由编译器自动收集所有类变量的赋值动作,静态语句块static{}的语句合并产生的。静态语句块只能访问到静态语句块之前的变量。
Thread 状态 NEW Runnable, Running Blocked Dead 状态
测试代码: join 是必须等待当前线程,其他线程才能运行。
public class TestJoin { /** * 线程实例的方法join()方法可以使得一个线程在另一个线程结束后再执行 * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { Thread t = new Thread(){ public void run(){ System.out.println("First Task Start ..."); System.out.println("First Task Sleep ...."); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("First Task Completed"); } }; Thread t1 = new Thread(){ public void run(){ System.out.println("Second Task Start ..."); System.out.println("Second Task Completed"); } }; t.start(); t.join(); t1.start(); } }
测试Thread .yield
public class TestYield { /** * •Yield是一个静态的原生(native)方法 •Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。 •Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态 •它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态 * @param args */ public static void main(String[] args) { //yield是将当前运行的机会给相同优先级的线程。 Thread producer = new Producer(); Thread consumer = new Consumer(); // producer.setPriority(Thread.MIN_PRIORITY); // consumer.setPriority(Thread.MAX_PRIORITY); producer.setPriority(Thread.MIN_PRIORITY); consumer.setPriority(Thread.MIN_PRIORITY); producer.start(); consumer.start(); } }
public class Producer extends Thread { public void run(){ for(int i = 0; i < 5; i++){ System.out.println("I am Producer : Produced Item "+i); Thread.yield(); } } }
public class Consumer extends Thread{ public void run(){ for(int i = 0; i < 5; i++){ System.out.println("I am Consumer : Consumed Item "+i); Thread.yield(); } } }