深入JAVA虚拟机

做项目的时候,总觉得手头的技能不够用;现在总能对之前的一些话深有感触:书到用时方觉少;没办法,素材也就这样,收拾心情学吧!

本书阐述JAVA的三大特性:跨平台性、安全性及网络移动性;近几年互联网的活跃,给Java也注了一剂生长素;

针对JAVA的一套流程:
1、编辑器编写Java源码(.java文件)
2、java文件经过Java编译器编程成Class文件
3、java虚拟机加载class文件(由类加载器完成)解释执行成字节码,再由虚拟机中的执行引擎去执行字节码文件

执行引擎有多种策略:
1、一次性解释字节码
2、较上一种执行引擎更快,消耗内存(即时编译Just In Time Compiler);第一次执行的字节码会被编译成本地机器代码,编译出的本地机器代码会被缓存,当方法调用的时候可以重用
3、该种引擎是自适应优化器;虚拟机开始的时候解释字节码,会监事运行中的程序活动,并且激励下使用最频繁的代码段,程序运行的时候,虚拟机只把那些惠东最频繁的代码编译成本地代码,

线程设计面试题

昨天的关于JAVA Thread的面试题:设计四个线程,其中两个线程对j加1操作,另外两个线程对j减1操作。发现这个面试题网上一大片,我这里也简单地记录一下:

/**
 * @author effine
 * @date 2013-10-28  下午11:50:34
 */

public class InterviewThread {

    private int j = 0;

    public static void main(String args[]) {

        InterviewThread it = new InterviewThread();

        /* 实例化内部类 */
        Inc inc = it.new Inc();
        Dec dec = it.new Dec();

        /* 循环得到四个线程 */
        for (int i = 0; i < 2; i++) {
            Thread t = new Thread(inc);
            t.start();
            t = new Thread(dec);
            t.start();
        }
    } //main method finish

    /* 同步加1方法 */
    private synchronized void inc() {
        j++;
        System.out.println(Thread.currentThread().getName() + "-inc:" + j);
    }

    /* 同步减1方法 */
    private synchronized void dec() {
        j--;
        System.out.println(Thread.currentThread().getName() + "-dec:" + j);
    }

    /* 加1线程类 */
    class Inc implements Runnable {
        public void run() {
            for (int i = 0; i < 100; i++) {
                inc();
            }
        }
    }

    /* 减1线程类 */
    class Dec implements Runnable {
        public void run() {
            for (int i = 0; i < 100; i++) {
                dec();
            }
        }
    }
    
}

File Tree

看到windows文件资源管理器,突然想用Java来实现这种不同层的文件缩进,参考OSC中一个博主的思想,记录一下;Code如下:

/**
* @author effine
* @date 2013年10月26日  下午1:25:14
*/

import java.io.File;

public class FileTree {
public static int count = 0;

public static void parse(File[] files) {
    if (files.length == 0) {
        FileTree.count--;
        System.out.println();
        return;
    } else {
        for (File f : files) {
            if (f.isDirectory()) {
                FileTree.count++;
                for (int i = 1; i <= FileTree.count; i++) {
                    System.out.print("\t");
                }
                
                System.out.println(f.getName());
                File[] files2 = f.listFiles();
                
                FileTree.parse(files2);
            }
            
        }
        for (File f : files) {
            if (!f.isDirectory()) {
                for (int i = 0; i <= FileTree.count; i++) {
                    System.out.print("\t");
                }
                System.out.println(f.getName());
            }
        }
        FileTree.count--;
    }
    
}

public static void main(String[] args) {
        File file = new File("d:/test");
        File[] files = file.listFiles();
        FileTree.parse(files);
    }
}

Java守护线程

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

  • Daemon的作用是为其他线程的运行提供便利服务,比如垃圾回收线程就是一个很称职的守护者。User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。public final void setDaemon(boolean on)

阅读全文