【友情链接】???线程入门学习,线程(多线程)的实现
【友情链接】???线程入门学习,线程同步机制 和 线程等待与唤醒机制
一、线程池
了解线程池
????????线程池概念∶ 线程池其实就是一个容纳多个线程的容器,线程池中的线程可以反复的使用,这样我们就省去了频繁创建线程对象的操作,无需因为反复创建线程而导致资源消耗过多。
Java中线程池的概念是在JDK1.5之后提供的
(1)java.util.concurrent.Executors :
是线程池的工厂类,主要是用来生成线程池
Executors类中的静态方法有:
static ExecutorService newFixedThreadPool(int nThreads)
该方法是用于创建一个可重用的固定线程数量的线程池
方法参数:
int nThreads:指定要创建线程池中包含的线程的数量
返回值:
ExecutorService接口
返回的是ExecutorService接口的实现类对象,
可以使用ExecutorService接来接收
(2)java.util.concurrent.ExecutorService :为线程池接口
用来从线程池中获取线程,调用start()方法来执行线程任务
方法:
submit(Runnable task)方法:提交一个Runnable任务用于执行
void shutdown()方法: 用于关闭或者销毁线程池
使用线程池的步骤
- 1.使用线程池的工厂类Executors提供的静态方法newFixedThreadPool()方法生产一个指定线程数量的线程池
- 2.创建Runnable接口的实现类,并重写run方法,设置线程的任务
- 3.调用ExecutorService类的对象的submit()方法,传递线程任务(实现类),开启线程,执行run()方法
- 4.调用ExecutorService类的对象的shutdown()方法销毁线程池
示例代码:
ublic static void main(String[] args) {
//1.使用线程池的工厂类Executors提供的静态方法newFixedThreadPool()方法生产一个指定线程数量的线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
//2.创建Runnable接口的实现类,并重写run方法,设置线程的任务
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
// 3.调用executorService类的对象的submit()方法,传递线程任务(实现类),开启线程,执行run()方法
executorService.submit(runnable);
executorService.submit(runnable);
executorService.submit(runnable);
//线程池会一直开启着,当线程池中的线程被使用完了之后,线程会自动归还到线程池,还可以下一次使用
// 4.调用ExecutorService类的对象的的shutdown()方法销毁线程池
executorService.shutdown();//程序不会一直执行了
}
测试结果:
二、Lambda表达式
了解Lambda表达式
????????Lambda表达式是在2014年3月Oracle发布的JDK1.8版本中添加的Java新特性;Lambda表达式其实就是一个匿名函数,Lambda表达式能够使用更加简洁更加灵活的代码来实现匿名内部类要实现的功能,该函数省略了我们使用匿名内部类时要写的多行代码,使用Lambda表达式我们最直接的感受就是只要写一行极少行甚至一行代码就能够实现匿名内部类中多行代码的功能。
Lambda表达式的使用----标准格式:
标准格式是由三个部分组成分别是:参数、箭头、代码
使用格式:
(参数列表) -> { 重写方法的代码 };
格式说明:
():是指接口中抽象方法的参数列表,没有参数,就空着;
有参数就写出参数,多个参数使用逗号分隔
->:表示传递的意思,就是指把参数列表中的参数传递到 { }中的方法体()
{}: 指重写接口的抽象方法的方法体
注意:
(一)使用Lambda表达式时,可以省略书写
1.(参数列表):参数列表中的数据类型,可以省略
2.(参数列表): 若只有一个参数,那么参数的类型和()都可以省略
3.{代码}:若{}中只有一行代码,无论是否有返回值,那么{}和返回值以及分号都可以省略,
注意省略了()、{}、return时分号一定要一起省略
(二)使用它Lambda表达式的前提
1.使用Lambda表达式必须具有接口,并且接口中有且只有一个抽象方法
(这种类型的接口也称为“函数式接口”)
2.使用Lambda表达式必需要有上下文联系推断的关系逻辑
示例代码:
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"匿名内部类实现多线程");
}
}).start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"Lambda标准格式实现多线程");
}).start();
new Thread(() ->System.out.println(Thread.currentThread().getName()+"Lambda省略格式实现多线程")).start();
}
测试结果:
|