sleep和wait的区别:
- sleep 和 wait 的区别
- sleep在阻塞的过程中不会释放锁
- wait在阻塞的过程中会释放锁
class Test implements Runnable{
private Object object;
public Test() {}
public Test(Object object) {
this.object = object;
}
@Override
public void run() {
while(true) {
synchronized (object) {
try {
System.out.println("当前---"+Thread.currentThread().getName()+"---在执行");
//Thread.sleep(1000);//睡眠的时候不释放锁 sleep在阻塞的过程中不会释放锁
object.notify(); //后来的唤醒之前睡眠的线程
object.wait(); //睡眠 wait在阻塞的过程中会释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前"+Thread.currentThread().getName()+"---出来了");
}
}
}
}
线程的生命周期 : 创建----就绪—执行—销毁 中间有个阻塞
线程池的概念:
newSingleThreadExecutor | 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 |
---|---|
newFixedThreadPool | 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 |
newScheduledThreadPool | 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行 |
newCachedThreadPoo | 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程 |
用于管理线程的四中方法:
newSingleThreadExecutor | 创建单个线程去执行所有的任务,超出的任务需要进行排队(FIFO) |
---|---|
newFixedThreadPool | 创建指定大小的线程池,任务过多时需要排队 |
newScheduledThreadPool | 创建指定大小的线程池,可以设置线程的执行时间与延迟时间,任务过多需要排队 |
newCachedThreadPoo | 不限制线程的数量,对于不用的线程会回收,需要的时候直接创建 |
简单来讲:
- 线程池
- 创建方式:
- 有一种方式叫先进先出,有一种可以给固定的线程池,有一种可以无线创建
- 有四中拒绝策略:
- 1、直接抛异常
- 2、不拒绝、不处理、抛给其他主线程
- 3、将任务队列中时间最长的剔除、接受新的任务
- 4、当任务满了、就不再接受任务
Jdk1.8新特性:
1、接口中引入了关键字 default,通过default修饰方法,可以在接口里面定义具体的方法实现。
interface Test{
public void show();
default int sum(int x,int y){
return x+y;
}
}
2、 Lambda表达式
需要接口中的抽象方法只能有一个
不带返回值:
In1 n1 = ()->System.out.println("测试n1");
n1.test();
interface In1{
public void test();
}
带参数带返回值
有返回值时需要加大括号
In2 n2 = (a,b)->{return a+b;};
interface In2{
public int sum(int a,int b);
}
Stream API
Stream是对集合对象操作的API,它专注于对集合对象进行各种非常便利,高效的聚合操作或者大批量操作,从而减少代码的复杂度。借助于lambda表达式,极大的提高编程效率和程序可读性。并且Stream支持串行和并行两种模式,使我们无需编写太多代码,就可以很方便的写出高性能的并发程序。
Stream对象每次操作后都会被关闭,因此其大多数方法的调用都会返回一个新的Stream对象