`
bnmnba
  • 浏览: 293580 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

线程、线程池、threadlocal

 
阅读更多
一个线程池里放两个线程、四个任务(runnable)。两个线程执行四个runnable。threadlocal的值被相同的线程共享,而可能是不同的任务。
看代码:


package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadPoolExecutor{
	public static void main(String[] args) throws InterruptedException {
		int threadNum=2;//实际启动的线程数
		int taskNum=4;//要运行的runnable数量,他们共享以上个数的线程
		ExecutorService threads=Executors.newFixedThreadPool(threadNum);
		for (int i = 0; i < taskNum; i++) {
			threads.execute(new MyRunnable("thread"+i));
		}
		while(!threads.isTerminated()){
			Thread.sleep(1000);
			if (!threads.isShutdown()) {
				threads.shutdown();
				System.out.println("线程池已经,停止接收任务准备停止");
				try{
					threads.execute(new MyRunnable("threadN"));
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("线程池已经终止");
		Thread.sleep(5000);
		System.out.println("主程序退出");
	}
}
class MyRunnable implements Runnable{
	private String name;
	public MyRunnable(String name){
		this.name=name;
	}
	public static ThreadLocal<Integer> locInt=new ThreadLocal<Integer>(){
		protected Integer initialValue() {
			return 0;
		}
	};
	public void run() {
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		int i=locInt.get();
		System.out.println(Thread.currentThread().getId()+" "+name+"的i:"+i);
		i++;
		locInt.set(i);
	}
	
}
 
运行结果:

线程池已经,停止接收任务准备停止java.util.concurrent.RejectedExecutionException

	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1760)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:658)
	at pp.thread.TestThreadPoolExecutor.main(TestThreadPoolExecutor.java:20)
8 thread0的i:0
9 thread1的i:0
8 thread2的i:1
9 thread3的i:1
线程池已经终止
主程序退出

 



分享到:
评论

相关推荐

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

    但是,在Hystrix线程隔离模式下,ThreadLocal数据可能会丢失,因为Hystrix将请求放入Hystrix的线程池中去执行,这时候某个请求就有A线程变成B线程了,ThreadLocal必然消失了。 知识点3:线程切换导致ThreadLocal...

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

    TransmittableThreadLocal 是一种专门为线程池设计的ThreadLocal解决方案,可以实现跨线程池之间的数据传递。它可以在多个线程池之间传递数据,解决了ThreadLocal 的局限性。 TransmittableThreadLocal 的实现原理...

    ThreadLocal的几种误区

    在服务器端,线程池的存在可能导致多个用户的请求被分配到同一个线程处理,因此,如果不注意清理,ThreadLocal变量可能会被不同用户访问到,造成数据泄露。 误区三:每个用户访问会有新的ThreadLocal 理论上来讲,...

    线程锁+ThreadLocal.docx

    线程锁通过`synchronized`关键字确保了共享资源的互斥访问,而线程池则通过高效地管理和复用线程,提高了系统的并发性能。在实际开发中,理解并合理运用这些机制,能够帮助我们编写出更加稳定和高效的多线程程序。

    ThreadLocal

    3. **线程池中的ThreadLocal**: 在使用线程池时,线程可能会复用,之前的ThreadLocal值可能会影响后续的任务。因此,如果在使用线程池时依赖ThreadLocal,需要特别处理线程退出或清理ThreadLocal。 总的来说,...

    Java单线程ThreadLocal串值问题解决方案

    Java单线程ThreadLocal串值问题解决方案 Java单线程ThreadLocal串值问题解决方案主要介绍了Java单线程ThreadLocal串值问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    ThreadLocal_ThreadLocal源码分析_

    4. **注意线程池中的ThreadLocal**:线程池中的线程可能会被重用,若不清理ThreadLocal,可能导致后续任务访问到错误的变量副本。 通过理解ThreadLocal的原理和最佳实践,我们可以更有效地利用它来解决多线程环境下...

    ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    2. 如果是线程池里的线程用 ThreadLocal 会有什么问题? ThreadLocal 的拓扑图: 虚线代表这弱引用,当前线程保存了 ThreadLocalMap 作为自己的 local 属性,而 Map 中的 key 又弱引用了 ThreadLocal,从而达到了...

    vb 多线程 实例(thread 类创建)

    线程池会复用已存在的线程,减少创建和销毁线程的开销。通过`ThreadPool.QueueUserWorkItem`方法,我们可以将任务添加到线程池。 8. **异常处理**: 在多线程程序中,捕获和处理异常特别重要。每个线程都有自己的...

    ThreadLocal原理及在多层架构中的应用

    - **难以调试**:由于ThreadLocal的隐式性,有时可能会导致难以发现的问题,特别是当线程池中的线程复用时。 ### 4. 使用注意事项 - 使用完毕后,应调用`remove()`方法清除ThreadLocal变量,防止内存泄漏。 - 尽量...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    9. **线程局部存储**:`ThreadLocal&lt;T&gt;`类允许在线程中创建局部变量,每个线程拥有自己的副本,互不影响。 10. **线程优先级**:虽然可以设置线程优先级,但不推荐频繁使用,因为操作系统调度策略可能使得高优先级...

    ThreadLocal 内存泄露的实例分析1

    而 Tomcat 中,每个请求都会创建新的线程来处理,这些线程在处理完请求后,通常不会立即终止,而是进入线程池等待下一次复用。因此,只要线程还在,`ThreadLocal` 中的 `MyCounter` 对象就不会被垃圾收集,也就意味...

    java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf

    - 在并发量非常大或者资源有限的环境中,过多使用ThreadLocal可能导致线程池中的线程复用问题,使得新线程获取到旧线程的数据,这时应谨慎使用。 总之,ThreadLocal是Java中处理线程安全问题的一种有效手段,尤其...

    InheritableThreadLocal & ThreadLocal

    4. 在Servlet容器中,谨慎使用InheritableThreadLocal,因为线程池中的线程可能会被复用,可能导致错误的会话信息传递。 总之,理解并熟练运用ThreadLocal和InheritableThreadLocal是Java并发编程中不可或缺的知识...

    目前项目在用性能稳定的线程池源码

    1. 初始化:每个工作线程在启动时,可能会初始化一些线程局部变量,如ThreadLocal,以便在执行任务时保持独立的数据环境。 2. 执行任务:PooledThread会有一个run方法,该方法从工作队列中取出任务并执行。执行完毕...

    ThreadLocal原理及在多层架构中的应用.pdf

    这样,即使在线程池环境下,每次任务执行时使用的就是线程私有的变量,不会产生线程安全问题。 在Java中,一个无状态的Bean(比如只有方法没有实例变量的类)是线程安全的,因为它不存储任何线程共享的状态。而有...

    java线程详解

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 ...Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己实现个ThreadLocal 四、透过现象看本质 Java线程:大总结

    2、导致JVM内存泄露的ThreadLocal详解

    1. **线程未正确销毁**:如果线程执行完毕后没有正确销毁或者线程池中线程长期存活,而`ThreadLocal`对象又未能及时清除,那么线程内的`ThreadLocalMap`将会持续占用内存,进而可能导致内存泄漏。 2. **...

    java多线程的讲解和实战

    10. **线程局部变量(ThreadLocal)**:为每个线程提供独立的变量副本,确保线程间的隔离,避免了共享状态带来的问题。 实战部分将通过具体的代码示例展示如何创建和管理线程,如何实现线程同步,以及如何利用...

    Java 多线程与并发编程总结.doc

    `ExecutorService`是线程池的接口,可以使用`Executors`工厂类创建不同类型的线程池,如固定大小线程池、可缓存线程池、单线程线程池等。 总之,Java多线程与并发编程是Java程序员必须掌握的核心技能,它涉及到操作...

Global site tag (gtag.js) - Google Analytics