JavaSE多线程之线程池和定时器

JavaSE多线程之线程池和计时器

1.线程间的等待唤醒机制

Object 类中
void wait ()  在其他线程调用此对象的 notify ()   方法或 notifyAll () 方法前,导致当前线程等待。
void wait (long timeout) 在其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者超过指定的时间量前,导致当前线程等待。
void notify () 唤醒在此对象监视器上等待的单个线程。
void notifyAll ()  唤醒在此对象监视器上等待的所有线程。

在这里插入图片描述

2.内存可见性问题 volatile

volatile 解决内存可见性问题
	 一、Java内存模型
	 volatile可以确保可见性
	 Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,
	 线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。
	 线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。
	 不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
3.Java中的可见性
	对于可见性,Java提供了volatile关键字来保证可见性。
	当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
	而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
    另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,
	并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。相较于 synchronized 是一种较为轻量级的同步策略。
volatile 变量,用来确保将变量的更新操作通知到其他线程。
可以将 volatile 看做一个轻量级的锁,但是又与
锁有些不同:
 对于多线程,不是一种互斥关系
 不能保证变量状态的“原子性操作”              

在这里插入图片描述

3.CAS算法

CAS 算法
CAS (Compare-And-Swap) 是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。
CAS 是一种无锁的非阻塞算法的实现。
CAS 包含了 3 个操作数:
需要读写的内存值 V
 进行比较的值 A
 拟写入的新值 B
 当且仅当 V 的值等于 A 时, CAS 通过原子方式用新值 B 来更新 V 的值,否则不会执行任何操作。

在这里插入图片描述

4.线程的状态转换图及常见执行情况

A:画图演示:  线程的状态转换图及常见执行情况
B: 新建 , 就绪 , 运行 , 阻塞 , 死亡
   新建:线程被创建出来
   就绪:具有CPU的执行资格,但是不具有CPU的执行权
   运行:具有CPU的执行资格,也具有CPU的执行权
   阻塞:不具有CPU的执行资格,也不具有CPU的执行权
   死亡:不具有CPU的执行资格,也不具有CPU的执行权

在这里插入图片描述

5.线程池的概述和使用

A:线程池概述
	程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
	在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池
B:内置线程池的使用概述
	JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
		public static ExecutorService newCachedThreadPool():根据任务的数量来创建线程对应的线程个数	
		public static ExecutorService newFixedThreadPool(int nThreads):固定初始化几个线程
		public static ExecutorService newSingleThreadExecutor():初始化一个线程的线程池
	这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法
		Future<?> submit(Runnable task)
		<T> Future<T> submit(Callable<T> task)
	使用步骤:
		创建线程池对象
		创建Runnable实例
		提交Runnable实例
		关闭线程池
C:案例演示:	线程池的使用

在这里插入图片描述
在这里插入图片描述

6.匿名内部类的方式实现多线程程序

A:案例演示
	匿名内部类的方式实现多线程程序
	new Thread(){代码…}.start();
	new Thread(new Runnable(){代码…}).start();
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200610233658303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUemhhemhhc3Nj,size_16,color_FFFFFF,t_70)

7.定时器的概述和使用

A:定时器概述
	定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
	在Java中,可以通过Timer和TimerTask类来实现定义调度的功能。
B:Timer和TimerTask
	Timer:public Timer()
		      public void schedule(TimerTask task, long delay):	
		      public void schedule(TimerTask task,long delay,long period);
		      public void schedule(TimerTask task,  Date time):
		     public void schedule(TimerTask task,  Date firstTime, long period):
	        TimerTask:定时任务
		    public abstract void run()
		    public boolean cancel()
    C:案例演示:定时器的使用

在这里插入图片描述

8.定时器的练习

A:案例演示
	定时任务的多次执行代码体现
	定时删除指定的带内容目录

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值