线程、线程池、Lock锁

30 篇文章 0 订阅
1 篇文章 0 订阅

1.线程:Thread

创建多线程的方法一:

一个进程可以拥有多个线程

.start多线程的启动

(1)创建一个类继承Thread

(2)重写润run()创建多线程做什么事就放到run()内

(3)创建多线程的对象

(4)使用线程对象.start()方法启动

注意:(1)调用start() 方法 让线程 进入就绪状态 等待 CPU调度

(2)继承Thread类的情况下 可以使用

可以通过this.setName();进行名字的设置

可以通过this.getName();进行名字的获取

(3) 在非继承Thread类的情况下 可以使用

Thread.currentThread().setName(“乌龟线程”);

Thread.currentThread().getName(); 获取名字

方法二:

\1. (1)让一个类 实现 Runnable 接口

(2)重写run() 方法 线程体

(3)创建Runnable对象

(4)将此对象放入 Thread内

2.设置线程的优先级 1 ~ 10

创建一条线程 默认的优先级是5

优先级高得 多执行

优先级低的 少执行

3.继承的方式 和实现的方式 有什么区别?

(1)java只能单继承

(2)实现接口后还可以在继承一个类

(3)使用 Runnable 可以更好的实现 共享数据问题

(4)继承方式 代码更容易实现

实现接口方式 稍微麻烦一点

方法三:

1.创建一个类 实现Callable<类型>接口

2.创建接口对象

3.创建未来任务对象

4.将未来的任务放入 Thread类

5.启动线程

6.通过未来任务.get();

注意:

\1. 可以将线程的结果进行返回 自定义返回值的类型

2.可以抛出异常

\3. 继承和实现的方式 只能通过 try{}catch(){} 处理

因为 父亲 没有抛出异常 方法重写 规定不能抛出 比父类更大的异常

多个线程操作共享数据 就会有线程安全问题

多个线程操作共享数据 就会有线程安全问题


2.线程控制:

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40Iiw0PY-1595645067608)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

总结:线程生命周期

运行状态的出口:阻塞、就绪、终止

就绪状态的入口:新生、运行、阻塞

讲解了线程同步、线程通信后会增加更多的状态:增加了两种阻塞状态

join():调用join()方法的 线程 会强行插队 直到执行完毕 其他线程 才能执行

sleep():从 运行状态 到 =》 阻塞状态==》 当等待的时间结束 会重新回到就绪状态

yield(): 线程的礼让 调用当前方法的线程从运行状态===》 就绪状态

setDaemon():设置守护线程 : 当主线程结束 此线程 自动结束

stop():结束线程 直接结束

interrapt():打上中断的标记 isInterrupted():查看是否已经打上标记


3.线程同步:

当多个线程访问同一个数据时,容易出现线程安全问题。需要让线程同步,保证数据安全。

synchronized(对象)同步代码块的语法结构

注意:(1)同步代码块内可以发生线程切换

(2)在同一时刻,同步代码块内只能有一个线程其他线程只能等待

同步方法内:

语法: 在方法体返回值的前面 + synchronized

(1)同步方法的同步监视器是this

(2)同步方法可以发生线程切换

(3)同一时刻 一条线程进入同步方法 则 其他线程 不能再进入其他的同步方法

(4)线程在同步方法外进行等待


4.Lock锁:

.lock()上锁 .unlock()解锁,解锁必须在finally中进行

boolean trylock();获取一个返回值true,false 立马拿到结果

lockInterruptibly()throws

newCondition()

ReadWriteLock:读写锁

获取同一把读写锁,可以多条线程一起读,只能有一条线程进行写操作

volatile:保证变量的可见性,被他修饰的内容可见性

可以多条线程一起读

写的时候 要保证只有一条线程写

使用读写锁 完成


5. 线程通信:

当生产完一件商品后,消费者进行消费,消费者消费完一件商品,消费者等待,通知生产者生产

wait(); 可以让线程进入等待状态

调用此方法 会释放锁

notify():唤醒 使用同一个同步监视器对象的 等待的线程

notifyAll(): 唤醒所有 使用同一个同步监视器对象的等待的线程

注意:

线程通信的相关方法 需要 放到 同步代码块或者同步方法内

newCondition: wait():线程等待

signal();,signalAll();唤醒


5.线程池:ExecutorService

.shutdown()关闭线程池

创建一条线程池:newSingleinreadExecutor();

创建固定线程池:newFixedThreadPool(4);

池中线程的数量可以动态变化:Executors.newCachedThreadPool();

.submit()里边可放Callable

.execute


6.fork和join 分解,合并 ForkjoinPool


7.CountDownlatch:门闩类

new CountDownlatch(2)门闩的数量 只能有效一次


8.CyclicBarrier 回环屏障

线程池节约的是创建线程的步骤

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值