Java多线程
2022-08-23 17:19:02 14 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
Java多线程相关知识
作者其他创作
大纲/内容
java.lang.Thread
通过特定Thread对象的run()完成操作,run()方法主体称为线程体
通过Thread对象的start()启动线程
特性
Thread():创建新Thread对象
Thread(String threadname):创建线程并指定线程实例名
Thread(Running target):指定创建线程目标对象,实现Runnable接口中run方法
构造器
继承Thread类
实现Runnable接口
联系与区别
API中创建线程两种方式
void start():启动线程,并执行对象run()方法
run():线程在被调度时执行的操作
String getName(String name):设置该线程名称
void setName(String name):设置该线程名称
static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
Thread类有关方法(1)
static void yield():线程让步
join():当某个程序执行流中调用其他线程join()方法时,调用线程将被阻塞,知道join()方法加入join线程执行完为止
static void sleep(long millis)
stop()
boolean isAlive()
Thread类有关方法(2)
Thread类
创建和使用
MAX_ORIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
线程优先级等级
getPriority()
setPriority(int new Priority)
涉及的方法
线程的优先级
新建
就绪
运行
阻塞
死亡
线程生命周期
Future接口
实现Callable接口
ExecutorService
Executors
使用线程池
JDK5.0新增线程创建方式
一组指令的集合,一段静态代码,静态对象
程序
程序的一次执行过程,或是正在运行一个程序,动态过程(资源分配的单位)
进程
一个进程同一时间并行执行多个线程,就是支持多线程的
调度和执行单位,每个线程拥有独立运行栈和程序计数器(PC)
进程进一步细分为线程,是每一个程序的一条执行路径
线程
定义
时间片
高优先级线程抢占CPU
抢占式
调度策略
同优先级组成先进先出队列,使用时间片策略
对高优先级,使用高优先度调度抢占式策略
Java调度方法
线程的调度
服务用户线程
守护线程
用户线程
Java线程分类
同步代码块
可在方法声明中,表示整个方法为同步方法
Synchronized使用方法
防止两个任务访问相同资源
synchronized的锁是什么
同步机制中的锁
明确范围,范围太小没锁住有安全问题的代码;范围太大,没发挥多线程的功能
同步范围
当前线程同步方法、同步代码块执行结束
当前线程同步代码块、同步方法中遇到break、return终止该代码块、该方法继续执行
当前线程在同步代码块、同步方法中出现未处理Error或Exception,导致异常结束
当前线程在同步代码块、同步方法中执行了线程对象wait()方法,当前线程暂停、并释放锁
释放锁的操作
线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程执行
线程执行同步代码块时,其他线程调用该线程suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)
不会释放锁的操作
不同线程占用对方需要的同步资源不放弃,都在等待对方放弃资源,于是形成死锁
出现死锁后,不会出现异常,不会出现提示,只是所有线程都处于阻塞状态,无法继续
死锁
专门的算法、原则
尽量减少同步资源的定义
尽量避免嵌套同步
解决方法
线程死锁问题
显示定义同步锁对象,同步锁使用Lock对象
java.util.concurrent.locks.Lock接口是控制多个线程对共享资源访问的工具
ReentrantLock类实现Lock,它拥有与synchronized相同的并发性和内存语义。在实现线程安全控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁
Lock(锁)
Lock显式锁,synchronized是隐式锁,出了作用域自动释放
Lock只有代码块锁,synchronized有代码块锁和方法锁
使用Lock锁,JVM花费较少时间调度线程,性能更好,扩展性更好
优先使用顺序:Lock>同步代码块(进入方法体,分配了相应资源)>同步方法(在方法体之外)
synchronized与Lock对比
wait()
notify()
notifyAll()
线程的通信
只有synchronized方法或synchronized代码块才能使用,否则java.lang.IllegaMonitorStateException异常
线程同步
尽量避免使用suspend()和resume()控制线程
thread.setDaemon(true)
多线程
0 条评论
回复 删除
下一页