多个先线程再处理用一个资源,处理的动作却不同
等待与唤醒机制:线程之间的通信:重点:有效利用资源
线程池:JDK1.5之后提供的,Executors 线程池的工厂类
Executors的静态方法:
static ExecutorService new FixedThreadPook(int nThreads)
参数:int nThreads创建线程池中包含的线程数量
返回值:ExecutorService接口,返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接受(面向接口的编程)
java.util.concurrent类 ExecutorCompletionService<V>:线程池接口
用来从线程池中获取线程,调用start方法,执行线程任务。
Future<V> submit(Runnable task, V result)
提交要执行的 Runnable 任务,并返回一个表示任务完成的 Future,可以提取或轮询此任务。 (提交一个Runable任务用于执行)
shut down():关闭摧毁线程池的方法
线程池的使用步骤:
1.使用线程池的工厂类Executors中提供的new FixedThreadPook生产一个指定线程胡亮的线程池
2.创建一个类,实现Runable接口,重写run方法,设置线程任务
3.调用ExecutorCompletionService中的submit,传递线程任务(实现类),开启线程
,执行run方法
4.调用ExecutorCompletionService中的shutdown方法销毁线程池(不建议执行)
package ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
public class Executors {
public static void main(String[] args) {
ExecutorService ex = java.util.concurrent.Executors.newFixedThreadPool(2);
ex.submit(new RunableImpl());
ex.submit(new RunableImpl());
ex.submit(new RunableImpl());//因为有连个线程 所以随机一个 都可以获取12 线程执行
ex.shutdown();//销毁
}
}
package ExecutorCompletionService;
public class RunableImpl implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
面向对象的思想:做一件事情,找一个能解决这个事情的对象,调用兑现给的方法,完成事情
函数式编程思想:只要能获取到结果,谁去做的怎么做的 都不重要,重视的是结果,不重视过程。
lanbda表达式的标准格式:有三部分组成
一些参数 一个箭头 一段代码
格式:
(参数列表)->{一些重写方法的代码};
解释说明格式
():接口中抽象方法的参数列表,没有参数,就空着,有参数就写出参数 多个参数使用,分割
->:传递的一次,吧参数传递个方法体{}
{}重写接口的抽象方法的方法体
使用lamabda省略格式:
lambad是可推到,可省略的
凡是根据上下文推导出来的内容,都是可以省略书写的
可以省略的 内容
1.(参数列表):括号中的参数列表的数据类型,可以省略不写
2.(参数列表):括号中的参数如果只有一个,那么类型和()都可以不写
3
{一写代码}:如果{}里的代码只有一行,无论是否有返回值,他都可以省略不写{},return,分号;都可以不写
注意:要省略三个必须一起省略
前提:
使用lambda必须具有接口,且要求接口中有且仅有一个抽象方法
2使用lambda必须具有上下文腿短
抽象方法的接口成为函数式接口