`

j2se基础---ThreadLocal

    博客分类:
  • J2SE
阅读更多
package cn.itcast.heima2;

import java.util.Random;

public class ThreadLocalTest {

	private static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
	private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();
	public static void main(String[] args) {
		for(int i=0;i<2;i++){
			new Thread(new Runnable(){
				@Override
				public void run() {
					int data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName() 
							+ " has put data :" + data);
					x.set(data);  //方式1 
/*					MyThreadScopeData myData = new MyThreadScopeData();
					myData.setName("name" + data);
					myData.setAge(data);
					myThreadScopeData.set(myData);*/
					
					//方式二,new 出来的实例是每个线程一个
					MyThreadScopeData.getThreadInstance().setName("name" + data);
					MyThreadScopeData.getThreadInstance().setAge(data);
					new A().get();
					new B().get();
				}
			}).start();
		}
	}
	
	static class A{
		public void get(){
			int data = x.get();
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " get data :" + data);
/*			MyThreadScopeData myData = myThreadScopeData.get();;
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());*/
			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());
		}
	}
	
	static class B{
		public void get(){
			int data = x.get();			
			System.out.println("B from " + Thread.currentThread().getName() 
					+ " get data :" + data);
			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("B from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());			
		}		
	}
}

class MyThreadScopeData{
	private MyThreadScopeData(){}
	public static /*synchronized*/ MyThreadScopeData getThreadInstance(){
		MyThreadScopeData instance = map.get();//得到线程相关的实例
		if(instance == null){ //改线程没有创建实例
			instance = new MyThreadScopeData();
			map.set(instance);
		}
		return instance;
	}
	//private static MyThreadScopeData instance = null;//new MyThreadScopeData();
	private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
	
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

分享到:
评论

相关推荐

    校园招聘面试心得与总结.docx

    - J2SE基础涵盖了很多面试常考问题,如基本类型及其封装类、equals与==的区别、对象方法、引用类型、哈希码、集合类的区别与用法、并发容器等。 - 还涉及面向对象特性、多线程、同步机制、并发包内的工具类,以及...

    java方向程序员面试资料集合,保证对你的面试有利,非常全面,涵盖j2ee,J2se,j2me,内部资料,拼命传出来的,忘各位珍惜

    1. **J2SE**:它是Java的基础,提供了运行Java应用程序的环境。主要包括Java语言基础、面向对象编程、集合框架、异常处理、多线程、输入/输出流、网络编程等内容。其中,集合框架如ArrayList、LinkedList、HashMap等...

    Java Threads英文第三版

    - 第一章介绍了线程的基础知识,包括Java中线程的基本术语,示例的使用说明,以及为什么需要使用线程。 2. **线程的创建与管理** - 第二章深入探讨了线程的创建和管理。包括线程的定义、创建方式、线程生命周期,...

    java经典面试题

    #### J2SE基础 1. **九种基本数据类型的大小,及其封装类**: - Java提供了八种基本数据类型(`byte`, `short`, `int`, `long`, `float`, `double`, `boolean`, `char`),每种类型都对应一个封装类。例如,`byte` ...

    java资料---Java SE.ppt

    随着版本的升级,JDK 1.1引入了JIT编译器,提高了性能,JDK 1.2则将Java技术划分为J2SE(Java标准版)、J2EE(Java企业版)和J2ME(Java微型版),并引入Swing组件库。JDK 1.3和1.4进一步增强了功能,如JNDI、JNI和...

    JAVA_BLOG.rar_blog_blog java

    这不仅包括了基础的J2SE(Java Standard Edition)部分,还涉及了JAVA WEB的全面内容。以下是这些领域的详细解析: **J2SE:** 1. **Java语法基础**:理解基本的变量、数据类型、运算符、控制结构(如if语句、...

    java面试题以及技巧

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java.lang包介绍

    在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...

    java面试题目与技巧1

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题及技巧4

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题及技巧3

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    java面试题以及技巧6

    │ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....

    Java API 1.6 中英文CHM

    3. **多线程**:Java 1.6对多线程的支持更加完善,包括Thread类、Runnable接口、synchronized关键字、volatile变量、ThreadLocal类以及并发工具类如Semaphore、CountDownLatch等。 4. **异常处理**:Java的异常处理...

    java多线程2

    在"23-多线程(02)"的压缩包中,很可能是进一步讲解了Java多线程的高级主题,如线程池的配置、并发集合(如ConcurrentHashMap、CopyOnWriteArrayList等)、线程局部变量(ThreadLocal)以及如何利用Future和...

    2008JAVA工程师高级培训教程6

    包括synchronized关键字、wait()和notify()方法、ThreadLocal、线程池(ExecutorService)等概念。 3. **图形界面开发**:Java提供了丰富的图形用户界面(GUI)组件库,如Swing和JavaFX。这部分可能会介绍如何构建...

    旧版本JDK JDK1.4

    随着J2SE 5.0(Java SE 5)的发布,一些更先进的特性如泛型、枚举的改进和注解等引入,标志着Java进入了新的时代。 然而,对于那些需要维护旧系统的开发者来说,了解和熟悉JDK 1.4仍然是必要的。同时,研究JDK 1.4...

    Java.Threads.3rd.Edition.txt

    根据提供的文件信息,我们可以推断出这是一...综上所述,《Java Threads 第三版》涵盖了Java线程编程的各个方面,从基础知识到高级主题均有涉及。对于希望深入了解Java并发机制的开发者来说,这本书是一份宝贵的资源。

Global site tag (gtag.js) - Google Analytics