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