多线程相关

一、线程局部变量 ThreadLocal

通过把数据存放在ThreadLocal中就可以让每个线程创建一个该变量的副本,不会和其他线程的副本冲突,从线程的角度看就好像每一个线程都完全拥有该变量一样。从而避免并发访问的线程安全问题。

ThreadLocal的3个public的方法:

T get():返回此线程局部变量中当前线程副本中的值
void remove():删除此线程局部变量中当前线程的值
void set(T value):设置此线程局部变量中当前线程副本中的值

如果多个线程之间需要共享资源以达到线程之间的通信功能,就使用同步机制;如果仅仅需要隔离多个线程之间的共享冲突,则可以使用ThreadLocal。

二、线程池

        线程池是一种线程的使用模式。创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。由于涉及操作系统的交互,系统启动一个新的线程的成本较高。使用线程池可以解决该性能问题,尤其当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。

        与数据库连接池类似,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象或者Callable对象传给线程池,线程池会启动一个空闲的线程来执行他们的run()或call()方法,当run()或call()方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个Runnable对象的run()或call()方法。

        除此之外,使用线程池可以有效控制系统中并发线程的数量。当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃。而线程池的最大线程数参数可以控制系统中并发线程数不超过此数。

        使用线程池来执行线程任务的步骤如下:

调用Executors类的静态工厂方法创建一个ExecutorService对象,该对象代表一个线程池
创建Runable实现类或Callable实现类的实例,作为线程执行任务
调用ExecutorService对象的submit()方法来提交Runnable实例或Callable实例
当不想提交任何任务时,调用ExecutorService对象的shutdown()方法来关闭线程池

        在开发过程中,合理地使用线程池可以带来 3 个好处。

  • 降低资源消耗。重复利用线程池中已经创建的线程,可以避免频繁地创建和销毁线程,从而减少资源消耗。
  • 提高响应速度。由于线程池中有已经创建的线程,因此当任务到达时,可以直接执行,不需要等待线程创建。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

三、线程通信

(1)使用同步监视器 synchronized(this)调用wait()、notify()、notifyAll()三个方法

(2)Condition实例控制线程通信。要获得特定额Lock实例的Condition实例,调用Lock对象的newCondition()方法即可。Condition类提供了3个方法:

await():导致当前线程等待,直到其他线程调用该Condition的signal()方法或signAll()方法来唤醒该线程
signal():唤醒在此Lock对象上等待的单个线程,若所有线程都在Lock对象上等待,则随机唤醒其中一个线程
signalAll():唤醒在此Lock对象上等待的所有线程。

(3)使用阻塞队列(Blocking Queue)控制线程通信。当生产者线程试图向阻塞队列中放入该元素,若队列已满,则表示线程被阻塞;当消费者线程试图从阻塞队列中取出元素是,如果该队列已空,则该线程被阻塞。

四、java实现多线程的方法

ref:Java多线程实现的四种方式_java多线程有几种实现方法-CSDN博客

1 继承Thread类,重写run方法

2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target

3.通过Callable和FutureTask创建线程

4.通过线程池创建线程

五、多线程实现数据隔离与数据共享

[Java学习笔记]ThreadLocal实现不同线程的数据隔离,同一线程的数据共享_同一进程的各个线程之间如何实现数据的共享和隔离-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值