线程的学习

线程类:Thread

线程的概念

1).进程中多个同时执行的任务
2).主方法程序运行就是打开一个进程,进程中至少存在一个线程 - 主线程 main

自定义线程的方式

1)自定义线程类 - 继承 Thread
a.自定义线程类,继承Thread
b.重写run()
c.创建线程对象
d.start()开启线程
结论: 一个类只能有一个父类,当他继承Thread,这个类就只能是线程类了,有局限性

2).自定义任务类 - 实现Runnable接口
a.自定义类任务类,实现Runnable接口
b.重写run()
c.创建任务类对象
d.通过任务类对象,构造线程对象
e.start()开启线程
结论:
a.类除了可以实现Runnable接口,还可以继承其他类,和实现其他接口,没有太多的局限性
b.在创建相同的任务线程时,任务对象可以重复使用

3).匿名内部类创建线程类 - 结合(1)或(2)
注意: 这不是一种创建方式,只是一种优化写法

Thread常用API:

1).currentThread() -> 获取当前线程对象
2).getName() ->获取当前线程对象的名字
3).getPriority() -> 获得线程优先级
setPriority -> 设置线程优先级
注意:
a.范围: 1 ~ 10
数越大,优先级越高
b.优先级只是改变cpu分配时间片的概率
4).isDeamon() -> 询问是不是守护线程
注意:
守护线程 / 前台线程
当所有的前台线程都结束之后,守护线程也会自动结束
java中自带的守护线程 - GC

5).Thread.sleep() -> 线程休眠指定时间

线程同步[线程安全]:

1.产生的原因: 多个线程共享一个资源
2.解决的办法: 使用同步锁(synchronized)
(1)同步方法锁:
a.只能同时被一个线程所持有,当线程执行完这个方法的时候,才会将锁释放
b.锁范围越大,效率越低
c.锁在方法上,实际上锁的还是this对象上加锁
d.锁普通方法: this对象上加锁
锁静态方法: 锁 类.class(类的字节码文件)对象

(2)同步代码块:
a.可以将一部分代码加锁, 同步代码锁,需要借助一个对象
b.加锁的对象: 可以是任意对象,只需要确保是多个线程所共享(对象是唯一的)
c.一般来说都会使用this表示对象
d.同步锁(对象锁),一个对象只能加一把锁,并且只能同时被一个线程所持有的

3.Lock锁 - 接口
1).实现类 -> ReentreantLock(可重入锁)
2).API:
加锁: 锁对象.lock()
解锁: 锁对象.unlock()
3)乐观锁/悲观锁 -> 理解原理(使用场景)

线程状态:

新建状态: new 一个对象
就绪状态:
a.通过调用start()进入就绪状态
b.run()就绪: 时间片到期,归还/调用yeild()
运行状态
a.cpu分配时间片进入到运行状态
阻塞状态(Blocked):
a.join() -> 造成别的线程阻塞
b.IO阻塞 -> 控制台输入/输出
c.计时等待 -> sleep(100)/wait(100)
d.无线等待 -> wait()/notifyAll()/notify()
e.锁阻塞 -> 加上同步锁/Lock锁
被终止状态: run()结束

线程通信:

1.两个线程有共享资源,并且线程之间有动作交互
2.实现: 使用wait() 和 notify()/notifyAll()
notify() -> 唤醒线程,每次中能唤醒一个线程,只能唤醒在等待的线程
notifyAll() -> 唤醒所有正在等待的线程

注意:wait() 和 notify 需要放在同一个锁中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值