`
iceside
  • 浏览: 13755 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
ThreadLocal实例 java,threadlocal,线程安全
package com.jk.thread;
/**
 * ThreadLocal 的应用实例
 * @author 刘金魁
 *
 */
public class SequenceNumber {
	//泛型
	private ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
		//重写initialValue()方法
		public Integer initialValue() {
			return 0;
		}
	};

	public int getNextNum() {
		seqNum.set(seqNum.get() + 1);
		return seqNum.get();
	}

	public static void main(String[] args) {
		SequenceNumber sn=new SequenceNumber();
		TestClient t1=new TestClient(sn);
		TestClient t2=new TestClient(sn);
		TestClient t3=new TestClient(sn);
		
		t1.start();
		t2.start();
		t3.start();
	}

	private static class TestClient extends Thread {
		private SequenceNumber sn;

		public TestClient(SequenceNumber sn) {
			this.sn = sn;
		}

		public void run() {
			for (int i = 0; i < 3; i++) {
				System.out.println("thread:["
						+ Thread.currentThread().getName() + "] sn ["
						+ sn.getNextNum() + "]");
			}
		}
	}
}
调用JavaCompiler进行动态编译 java,动态编译
package com.jk.compiler;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaFileObject;
import javax.tools.JavaCompiler.CompilationTask;

/**
 * 调用Java编译器进行动态编译
 */
public class CompileTest {
	public static void main(String[] args) {
		String className = "Calculator";
		String methodName = "calculate";
		String expression = "1+2+3";
		String source = "package com.jk;public class " + className
				+ "{ public static double " + methodName
				+ "(){ return (double)" + expression + " ;}}";
		JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();// 需要使用jdk目录下的jre,否则无法获取到编译器
		StandardJavaFileManager fileManager = compiler.getStandardFileManager(
				null, null, null);
		StringSourceJavaObject sourceObject = new CompileTest.StringSourceJavaObject(
				className, source);
		Iterable<? extends JavaFileObject> fileObjects = Arrays
				.asList(sourceObject);
		Iterable<String> options = Arrays.asList("-d", ".\\bin");// 指定类生成路径
		CompilationTask task = compiler.getTask(null, fileManager, null,
				options, null, fileObjects);
		boolean results = task.call();
		if (results) {
			System.out.println("Compile successfully");
		}
		ClassLoader loader = CompileTest.class.getClassLoader();
		try {
			Class clazz = loader.loadClass("com.jk." + className);
			Method mainMethod = clazz.getMethod(methodName, new Class<?>[] {});
			Object value = mainMethod.invoke(null, new Object[] {});
			System.out.println(value.toString());

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 通过String构造Java源文件
	 * 
	 * @author 刘金魁
	 * 
	 */
	private static class StringSourceJavaObject extends SimpleJavaFileObject {
		private String content = null;

		public StringSourceJavaObject(String name, String content) {
			super(URI.create("string:///" + name.replace('.', '/')
					+ Kind.SOURCE.extension), Kind.SOURCE);
			this.content = content;
		}

		public CharSequence getCharContent(boolean ignoreEncodingErrors) {
			return content;
		}
	}
}
Global site tag (gtag.js) - Google Analytics