停止线程
不推荐使用jdk提供的stop(),destroy()方法
推荐线程自己停下来
建议使用一个标志位进行终止变量,当flag=false则停止线程
线程休眠
sleep指定当前线程阻塞的毫秒数
sleep存在异常interuptedException
sleep时间到达后线程进入到就绪状态
sleep可以模拟网络延时倒计时等
每一个对象都有一个锁,sleep不会释放锁
线程礼让
让当前执行的线程暂停,但不阻塞
让线程从运行状态转为就绪状态
让cpu重新调度,礼让不一定成功,看cpu
礼让 thread.yield()方法
线程强制执行
thread.join()等这个线程结束后,再执行其他的线程,其他线程阻塞
可以想象成插队,不建议使用
线程优先级
Java会提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级来决定应该调度哪个线程来执行。
线程优先级用数字表示,范围从1-10
thread.min_priority=1
thread.max_priority=10
thread.norm_priority=5
使用下面方式获取或改变优先级
getpriority()setpriority()
优先级低的线程只意味着获得调度的概率低,并不是说优先级低就不被调度了,这都是看cpu的调度
守护线程
线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕 如:后台记录操作日志,监控内存,垃圾回收等待
线程同步
形成条件:队列和锁
关键词:synchronized
同步方法和同步块
通过synchronized,实现同步方法和同步块
synchronized方法控制对象的访问,每个对象对应一把锁
死锁避免方法
产生死锁的四个必要条件:
1.互斥条件,一个资源每次只能被一个进程使用
2.请求与保持条件:一个进程因请求资源时而阻塞,对以获得的资源保持不放
3.不剥夺条件:进程以获得的资源,在未使用完之前,不能强行剥夺
4.循环等待条件:若干进程之间,形成头尾相接的循环等待资源关系
我们只需解决以上任意一个或者多个,就可以避免死锁发生
Lock锁
lock锁是显示锁(手动开启和关闭锁)synchronized锁是隐式锁,出了作用域,自动释放锁
Lock只有代码块锁,synchronized锁有代码块锁和方法锁
使用Lock锁,JVM花费较少的时间来调度线程,性能更好,并且具有更好的扩展性(提供更多的子类)。
优先使用顺序:
Lock->同步代码块(已经进入了方法体,分配了相应的资源)->同步方法(在方法体之外)
线程池
背景:经常创建和销毁,使用量特别大的资源,比如并发情况下的线程,对线程影响很大。
思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。实现重复利用。类似交通工具。
好处:
提高响应速度,(减少了创建新线程的时间)
降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
便于线程管理:corepoolsize:核心池大小
maximumpoolsize:最大线程数
keepalivetime:线程没有任务时最多保持多长时间后会终止
使用线程池:
线程池相关的api:executorservice和executor
executorservice:真正的线程池接口。常见的子类threadpoolexecutor