线程池:
工作原理:线程池里面有很多个线程,由线程池这个容器维护
①有很多任务(task)处于一个队列(Queue)状态
②线程池容器分配一个线程对象(thread),负责处理线程任务task,此时这个线程就处于被占用状态。有其它任务又进来了,线程池容器分配其它线程对象来处理!
③一旦处理任务(task)的线程执行任务结束,它就空闲了(并不释放掉),又有新的任务抵达 ,那么它可能又会被线程池容器分配去处理任务!
④综上所述,我们都是在重复利用线程池里面的线程来处理任务,没有将里面的线程对象销毁释放!
优点:减少系统资源的利用
创建方式:
ExecutorService theadPool= Executors.newFixedThreadPool(int num);
方法:
theadPool.submit(线程对象);
线程的六个状态:
new:创建线程对象
就绪:调用start()方法等待cpu调度
运行:开始运行
堵塞:没有拿到锁
无线等待:wait();只能被其他线程唤醒
计时等待:wait(long times)(醒后没有锁对象)sleep(long times)(醒后直接拿到锁对象)
被终止:死亡
Lamdba:
使用条件:必须是函数式接口(有且仅有一个抽象方法的是函数式表达式)
标准格式:(参数类型,变量名)->{代码块}
(int a,int b)->{代码块}
例:new Thead(()->{System.out.println(“HelloWorld”);}).start;
简化格式:
(a,b)->{代码块};
如果只有一句可以省略大括号 return和分号,必须一起省略
(a,b)->语句
如果只有一个参数的话可以省略小括号
a->语句
Stream流:
单列集合获取流方式:
list.stream();
set.stream();
双列集合获取流方式:
map.keySet().stream();
map.entrySet().stream();
map.value().stream();
数组获取流方式:
Stream.of(数组);
流获取数组:
Stream.toArray(流对象):获取一个object类型的数组
Stream.toArray(数据类型[]::new)获取指定类型的数组
流方法:
filter:过滤
limit:获取前几个
skip:跳过几个获取
map();映射,可以把数据映射成一个对象
concat():将两个流合并
foreach():逐一处理
count():统计个数
注意:
1.流必须要用终结方法(foreach,count)不然不会执行
2.创建出来的流只能用一次,被终结了以后就不能使用了
3.除去终结方法都有返回值,所以可以使用链式
List <String>list=new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张六");
//filter过滤,获取姓张的
list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s));//张三,张六
//limit获取前几个
list.stream().limit(2).forEach(s-> System.out.println(s));//张三,李四
//skip跳过几个
list.stream().skip(1).forEach(s-> System.out.println(s));//李四,王五,张六
//count统计个数
System.out.println(list.stream().count());//4
//创建Student对象,创建有参构造,用map映射创建对象
list.stream().map(s->list1.add(new Student(s))).count();
System.out.println(list1);
Stream.concat(list.stream().filter(s->s.startsWith("李")),list.stream().filter(s->s.startsWith("王"))).forEach(s-> System.out.println(s));//李四,王五
File
常用构造方法:
File file=new File(“String path”);
ps:一个File对象代表硬盘中实际存在的一个文件或者目录。**无论该路径下是否存在文件或者目录,都不影响File对象的创建。
File获取功能的方法:
getPath():获取file对象的相对路径
getAbsolutePath():获取file对象的绝对路径,如果没有盘符默认项目根目录
getName():获取file对象表示的文件或者目录的名字
length();获得file对象的字节大小(如果是文件就获取真实字节,如果是目录或者不存在就返回值0);
ps:有后缀的名字不一定就是文件还可能是目录(d:/io/a.txt a.txt可能就是个目录)
File file=new File("d:/io/a.txt");
//获取相对路径
System.out.println(file.getPath());//io/a.txt
//获取绝对路径,如果没有盘符就根据相对项目根目录
System.out.println(file.getAbsolutePath());//D:\IDEAproject\Yuxi\io\a.txt
//获取file对象表示的文件或者目录的名称
System.out.println(file.getName());//a.txt
//获取file对象如果是文件的字节大小(如果不存在就是0)
System.out.println(file.length());//0
File类判断功能的方法
exists():判断file对象是否真实存在
isFile():判断file对象是否是文件
isDircetory():判断对象是否为目录
//exists():判断这个file对象是否真是存在
System.out.println(file.exists());//true
//判断file对象是不是目录
System.out.println(file.isDirectory());//false
//判断file对象是不是文件
System.out.println(file.isFile());//true
File类创建删除功能的方法
creatNewFile();当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
delete():删除由此File表示的文件或目录。 【如果File表示目录,则目录必须为空才能
mkdir():创建由此File表示的目录
mkdirs():创建由此File表示的目录,如果是多级目录,父级目录不存在时会一并创建
File目录的遍历
list() :// 返回一个String数组,表示该File目录中的所有子文件或目录。
listFiles() :// 返回一个File数组,表示该File目录中的所有的子文件或目录。
//list() :// 返回一个String数组,表示该File目录中的所有子文件或目录。
String[] list = file.list();
//listFiles() :// 返回一个File数组,表示该File目录中的所有的子文件或目录。
File[] files = file.listFiles();
递归:
遍历文件夹需要用到递归(在当前方法调用自己的现象),可能会出现栈内存溢出异常
优点:代码简洁、清晰,并且容易验证正确性。
public static void main(String[] args) throws IOException {
File file=new File("d:/javaee168");
print(file);
}
public static void print(File file){
//使用递归获取后缀名为.Java的文件
//判断file对象是否为空
if (file!=null){
//判断是否为文件
if (file.isFile()){
//是否以.java结尾
if (file.getName().endsWith(".java")){
//是就输出他的绝对路径
System.out.println(file.getAbsolutePath());
}
}else {
//这个是目录
//遍历循环目录里的每个文件再次判断为文件还是目录
for (File f : file.listFiles()) {
if (f.isFile()){
if (f.getName().endsWith(".java")){
System.out.println(f.getAbsolutePath());
}
}else {
//是目录就重新调用方法执行
print(f);
}
}
}
}
}
晚安各位,goodnight;