- 浏览: 222437 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
junzi2013:
df
黑马程序员:MyEclipse9 常用快捷键 中英文对照 及 快速get set方法 -
junzi2013:
dfsdafadsfsd
黑马程序员:MyEclipse9 常用快捷键 中英文对照 及 快速get set方法 -
idealab:
博主说的OpenCSV, JavaCSV, SuperCSV都 ...
csv调研 -
tanxin:
楼主怎么解决这个问题的呢?
坑爹的zookeer -
yy22258867:
:twisted:
黑马程序员19-7:foreach遍历核心源码,遍历HashMap需要用map.keySet()或map.entrySet()
package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; //单一条线程,这条线程所产生的数据由在这条线程new出来的对象共享 //本题中,线程1产生的数据a,由A对象和B对象使用 //线程2产生的数据b,由A对象和B对象使用 public class ThreadScopeShareData { // private static int data = 0; private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>(); 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); threadData.put(Thread.currentThread(), data); new A().get(); new B().get(); } }).start(); } } static class A { public void get() { int data = threadData.get(Thread.currentThread()); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); } } static class B { public void get() { int data = threadData.get(Thread.currentThread()); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); } } }
输出结果:
Thread-0 has put data :806274789 Thread-1 has put data :1710804129 A from Thread-0 get data :806274789 A from Thread-1 get data :1710804129 B from Thread-0 get data :806274789 B from Thread-1 get data :1710804129
下面使用了ThreadLocal类,这个由API提供的类解决了共享变量的思路,其输出结果也如上。
public class ThreadLocalTest { private static ThreadLocal<Integer> x = new ThreadLocal<Integer>(); 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); 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 ); } } static class B{ public void get(){ int data = x.get(); System.out.println("B from" + Thread.currentThread().getName() + " get data: " + data ); } } }
这个需要学习里边的思想
package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; // 往线程池x里边存入一个整形数据,然后由其他的线程池对象共享使用 // 新的线程存新的数据吗,由其他线程池对象共享使用 // 线程池对象的类的设计,单例的设计,拿到实例,set,拿到实例,get 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); /* MyThreadScopeData myData = new MyThreadScopeData(); myData.setName("name" + data); myData.setAge(data); myThreadScopeData.set(myData);*/ 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; } }
输出结果如下:
Thread-0 has put data :-1520297586 Thread-1 has put data :-1519143339 A from Thread-1 get data :-1519143339 A from Thread-0 get data :-1520297586 A from Thread-1 getMyData: name-1519143339,-1519143339 A from Thread-0 getMyData: name-1520297586,-1520297586 B from Thread-1 get data :-1519143339 B from Thread-0 get data :-1520297586 B from Thread-1 getMyData: name-1519143339,-1519143339 B from Thread-0 getMyData: name-1520297586,-1520297586
发表评论
-
Java中的IO整理完整版
2013-02-15 17:23 704http://developer.51cto.com/art/ ... -
Myeclipse中导入zip文件查看源代码
2012-09-21 23:35 1052用Myeclipse的时候,出现无法查看源码的话,导入jdk文 ... -
==与equals
2012-09-13 20:15 652一般基本数据类型的比较用 == 当涉及到对象、字符串的时候,就 ... -
多线程课程001:线程安全的问题
2012-09-13 14:37 810下面的做法,会发现输出结果被打断了。 package co ... -
多线程课程001:线程安全的问题
2012-09-13 11:14 791package com.lee.thread; pu ... -
内部类的实际应用
2012-09-13 11:01 664public class TraditionalThreadS ... -
Java接口
2012-09-11 12:07 763Java接口的方法只能是抽象的和公开的,Java接口不能有构造 ... -
移位运算符
2012-09-11 09:31 842移位运算符 <<左移 a<<b,a转 ... -
【总结】gridbaglayout布局管理器
2012-08-15 11:19 692http://blog.sina.com.cn/s/blog_ ... -
【练习_00010】java不重复随机数
2012-08-14 01:26 698package com.heima.test; impo ... -
【练习】判断一个字符串中某些字段出现的次数
2012-08-14 01:08 973package com.heima.test; im ... -
选择、冒泡、折半排序查找方法
2012-08-13 15:06 1217import java.util.Arrays; i ... -
自己写的杨辉三角
2012-08-12 16:41 805package com.lee.graphic; p ... -
交换两个数的位置,不用中间变量
2012-08-06 02:28 1112a ^= b; b ^= a; a ^= b; 1 ... -
未解问题,定时器无法自定义切换时间
2012-07-30 18:08 1008package com.heima.test004.enu ... -
黑马程序员:设计模式,享元模式flyweight
2012-07-23 02:13 0如果有很多很小的东西,对象,当他们有很多属性是相同的,就可以把 ... -
黑马程序员:for综合图形整合结晶
2012-07-23 01:16 800package Graph; public clas ... -
JS: js获取字符串长度
2012-07-20 18:01 0<SCRIPT LANGUAGE="Jav ... -
传智27-2: 模拟Tocat浏览器,写网页蜘蛛爬虫,抓取网页信息
2012-07-12 17:03 0package cn.itcast.net.p2.ie_s ... -
传智27-1:多线程上传图片,阻塞防止while空转
2012-07-12 16:59 0package cn.itcast.net.p1.uplo ...
相关推荐
### 多线程编程指南:全面解析与应用 #### 多线程编程的定义与重要性 多线程编程是一种让程序能够同时执行多个任务的技术,通过在单一进程中创建多个线程来实现并发操作,从而提高了程序的效率和响应速度。这种...
Java中的ThreadLocal是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...
- **设置范围**、**获取范围**:说明了如何设定线程的作用域,即线程是否可以在整个系统范围内可见或仅限于创建它的进程内部。 #### 用同步对象编程 - **互斥锁属性**:深入探讨了互斥锁的使用,包括如何初始化、...
### Solaris多线程编程指南知识点汇总 #### 一、多线程基础介绍 - **定义多线程术语** - **线程**: 操作系统能够进行运算调度和分配的基本单位,是进程内的一个执行实体。 - **并发性**: 多个线程在同一时间段内...
具体做法是在使用`QsqlQuery`变量时将其作用域限定在一个局部范围内,例如在一个代码块内使用 `{}` 花括号明确其生命周期。例如: ```cpp { QSqlQuery query(db); if (!query.exec("SELECT * FROM table")) { ...
操作系统中的线程是执行上下文的一个基本单位,它在进程的范围内运行,共享同一内存空间。线程模型的引入使得程序能实现并发执行,提高了系统的并行性和资源利用率。在这个主题中,我们将深入探讨线程的概念、类型、...
TLS允许每个线程拥有自己的数据副本,即使这些数据在全局范围内声明。这对于需要在多个线程间区分状态的情况非常有用。 总结,Windows多线程编程涉及的内容广泛,从线程创建、同步、通信到线程管理,都需要开发者...
- **概念**:线程范围内共享变量是指在线程间共享的数据,需小心处理以避免竞态条件和数据不一致性。 - **作用**:允许线程间通信和协作,但需采用适当的同步机制(如`synchronized`关键字、`Lock`接口)以确保数据...
### Linux多线程手册知识点详解 #### 一、多线程基础介绍 ##### 定义多线程术语 - **线程**:是进程中的一个执行单元,它共享进程的资源,但拥有独立的栈和寄存器上下文。 - **多线程**:指在一个进程中同时运行...
### Linux多线程编程指南知识点总结 #### 一、多线程基础介绍 - **定义多线程术语:** - **线程(Thread)**:进程内的一个执行单元,是CPU调度的基本单位。 - **并发(Concurrency)**:多个任务同时进行的概念,但...
同步对象,如互斥锁、信号量、条件变量,用于解决多线程环境中的竞态条件和死锁问题。正确使用同步对象可以确保数据的一致性和线程的安全性。 **互斥锁**:是一种常用的同步机制,用于保护临界区,即一段不能被多个...
1. **全局变量**:全局变量在整个程序范围内可见,包括所有线程。当一个线程修改全局变量时,其他线程也可以立即看到这个变化。然而,由于多线程可能导致并发访问同一变量,因此需要考虑同步机制,如使用“锁定资源...
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
### iOS开发多线程编程指南 #### 简介与文档结构 本指南旨在帮助iOS开发者深入了解多线程编程的概念、原理以及最佳实践。多线程编程是提高应用程序响应性和性能的关键技术之一,在iOS开发中尤其重要。通过合理地...
在分析Netty5多线程编程之前,首先需要了解Java内存模型与多线程编程的关系。硬件技术的进步,特别是多核处理器的发展和成本的降低,使得多任务处理成为操作系统的基本功能。多核处理器能够同时执行多个线程,使得...
Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程范围内共享...