一.Lamda表达式
- 避免匿名内部类定义过多,让代码看起来更加简洁,只留下核心的逻辑
- 实质属于函数式编程的概念
Lamda表达式的特点 - Lamda表达式只能有一行代码的情况下才能简化成一行,如果有多行,那么就用代码块包裹。
- 前提是接口为函数式接口。
- 多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号。
二.线程停止
- 推荐线程自己停下来
- 建议使用一个标志位进行终止变量。当flag=false,则终止线程运行
- 步骤:
1.线程中定义线程体使用的标识
2.线程体使用该标识
3.对外提供方法改变标识
三.线程休眠
◆sleep (时间)指定当前线程阻塞的毫秒数;
◆sleep存在异常InterruptedException;
◆sleep时间达到后线程进入就绪状态; .
◆sleep可以模拟网络延时,倒计时等。
◆每一个对象都有一个锁,sleep不会释放锁;
四.线程礼让
◆礼让线程,让当前正在执行的线程暂停,但不阻塞
◆将线程从运行状态转为就绪状态
◆让cpu重新调度,礼让不- -定成功!看CPU心情
五.join
◆Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞(可以想象成插队),代码示例:
//测试join方法,想象成插队
public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("vip开始插队");
}
}
public static void main(String[] args) throws InterruptedException{
//启动线程
TestJoin testJoin=new TestJoin();
Thread thread=new Thread(testJoin);
thread.start();
//主线程
for (int i = 0; i < 10; i++) {
if (i==3){
thread.join(); //开始插队
}
System.out.println("main"+i);
}
}
}
运行结果:
六.线程状态
七.线程优先级
- Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。
- 线程的优先级用数字表示,范围从1~10 :
Thread.MIN_PRIORITY=1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5; - 改变或获取优先级 : getPriority() . setPriority(int xxx)
- 优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用了,这都是看CPU的调度。
八.守护(daemon)线程
- 线程分为用户线程和守护线程
- 虚拟机必须确保用户线程执行完毕
- 虚拟机不用等待守护线程执行完毕
- 如,后台记录操作日志,监控内存,垃圾回收等待…
九.线程同步
- 并发 : 同一个对象被多个线程同时操作。
- 处理多线程问题时,多个线程访问同一个对象﹐并且某些线程还想修改这个对象.这时候我们就需要线程同步﹒线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。
- 由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访冲突问题﹐为了保证数据在方法中被访问时的正确性﹐在访问时加入锁机制
synchronized , 当一个线程获得对象的排它锁﹐独占资源﹐其他线程必须等待,使用后释放锁即可﹒存在以下问题:
1.一个线程持有锁会导致其他所有需要此锁的线程挂起;
2.在多线程竞争下,加锁﹐释放锁会导致比较多的上下文切换和调度延时,引起性能问题;
3.如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒
置﹐引起性能问题。