`
buzhucele
  • 浏览: 327440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal在线程池中的使用方法

    博客分类:
  • java
阅读更多
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadLocalTest {

	public static void main(String[] args) {

		MyThreadPoolExecutor pool = new MyThreadPoolExecutor(2, 2, 10,
				TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000));

		int i = 0;
		while (true) {
			final int loop = i++;
			// 进行set的Runnable
			pool.execute(new Runnable() {
				@Override
				public void run() {
					MyThreadLocal.currentAgentId.set(1);
					System.out.println(loop + "=1==" + Thread.currentThread()
							+ "seted currentAgentId:"
							+ MyThreadLocal.currentAgentId.get());
				}
			});

			pool.execute(new Runnable() {
				@Override
				public void run() {
					System.err.println(loop + "=2==" + Thread.currentThread()
							+ "seted currentAgentId:"
							+ MyThreadLocal.currentAgentId.get());
				}
			});

			pool.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println(loop + "=3==" + Thread.currentThread()
							+ "seted currentAgentId:"
							+ MyThreadLocal.currentAgentId.get());
				}
			});

			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.err.println("================");
		}
		// pool.shutdown();
	}

}

class MyThreadPoolExecutor extends ThreadPoolExecutor {

	public MyThreadPoolExecutor(int i, int j, int k, TimeUnit seconds,
			ArrayBlockingQueue<Runnable> arrayBlockingQueue) {
		super(i, j, k, seconds, arrayBlockingQueue);
	}

	@Override
	protected void beforeExecute(Thread t, Runnable r) {
                //任务执行回调可以作为重置操作
		MyThreadLocal.currentAgentId.set(888);
	}
	
	protected void afterExecute(Runnable r, Throwable t) {
                //任务执行回调可以作为重置操作
		MyThreadLocal.currentAgentId.set(null);
	}

}

abstract class MyThreadLocal {
	public static ThreadLocal<Integer> currentAgentId = new ThreadLocal<Integer>();
}
分享到:
评论

相关推荐

    ThreadLocal垮线程池传递数据解决方案.docx

    ThreadLocal垮线程池传递数据解决方案.docx

    详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    主要介绍了详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    美团面试,问了ThreadLocal原理,这个回答让我通过了

    面试过程中他问了ThreadLocal原理(上次问线程池,这次问ThreadLocal,美团爸爸这么喜欢线程安全机制么),今天详细讲一讲ThreadLocal原理。 ThreadLocal ThreadLocal是线程的内部存储类,可以在指定线程内存储数据...

    Java面试 spring知识点 线程池 面试题

    Spring原理 2 Spring ioc 原理 3 Bean生命周期 3 Java反射 4 beanfactory和applicationcontext 5 类装载器ClassLoader 6 Spring aop 原理 6 Aop代理 7 Spring 事物 10 ...Spring TaskExecutor线程池 16

    Java并发编程学习笔记

    本文档主要内容如下: 1、线程安全和锁 Synchronized 底层实现原理...8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、.....

    ThreadLocal、InheritableThreadLocal详解

    多线程访问同一个共享变量时,容易出现并发冲突,为了保证线程的安全,一般使用者在访问共享变量时,需要进行适量的同步。而ThreadLocal提供了线程的私有变量,每个线程都可以通过set()和get()来对这个私有变量进行...

    Java进阶教程,面试大全,包罗万象

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    Java进阶教程,面试大全

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    transfertable-thread-local::pushpin:TransmittableThreadLocal(TTL),缺少框架中间件的Java:trade_mark:std lib(简单和0依赖),提供了增强的InheritableThreadLocal,即使使用线程池组件也可以在线程之间传输值

    :backhand_index_pointing_right:在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。一个Java标准库本应为框架/中间件设施开发提供的标配能力,本库...

    java线程详解

    三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步 六、线程安全类 七、线程死锁 八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java...

    Java并发编程相关技术使用案例

    线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的应用、Completablefuture的应用、手写阻塞队列、fork...

    Java并发编程(学习笔记).xmind

    (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置交互 (3)简化异步事件的处理:服务器应用程序在接受...

    java8源码-geektime-java-common-mistakes:geektime-java-常见错误

    缓存请求业务过程中要使用的信息 错误用法 Coding: Testing: 正确用法 Coding: Testing: ConcurrentHashMap 是线程安全的,并不代表一定线程安全 线程安全的并发容器只能保证方法级的操作原子性,多个操作间没有安全...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    Java并发编程实战

    4.4 在现有的线程安全类中添加功能 4.4.1 客户端加锁机制 4.4.2 组合 4.5 将同步策略文档化 第5章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 5.1.2 迭代器与Concurrent-ModificationException ...

    Java 并发编程实战

    4.4 在现有的线程安全类中添加功能 4.4.1 客户端加锁机制 4.4.2 组合 4.5 将同步策略文档化 第5章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 5.1.2 迭代器与Concurrent-ModificationException ...

    Java并发编程原理与实战

    ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....

    BATJ面试题汇总及详解65页

    BATJ面试题汇总及详解65页 JAVA面试题汇总 ...volatile、ThreadLocal的使用场景和原理? ThreadLocal什么时候会出现OOM的情况?为什么? synchronized、volatile区别? synchronized锁粒度、模拟死锁场景?

    Android开发艺术探索.任玉刚(带详细书签).pdf

    13.2 使用multidex来解决方法数越界 455 13.3 Android的动态加载技术 463 13.4 反编译初步 469 13.4.1 使用dex2jar和jd-gui反编译apk 470 13.4.2 使用apktool对apk进行二次打包 470 第14章 JNI和NDK编程 473 ...

Global site tag (gtag.js) - Google Analytics