Java线程池以及Lambda表达式简单总结

1. 线程池的使用

public static ExecutorService newFixedThreadPool(int nThreads);
得到一个线程对象,初始化参数是要求的当前线程池中的线程数

public Future submit(Runnable target);
从线程池中获取一个线程对象,并且执行给定的Runnable接口实现类对象作为执行目标

演示代码

package com.qfedu.b_executors;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class MyThread1 implements Runnable {
	@Override
	public void run() {
		System.out.println("Runnable接口实现类,线程目标代码");
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(Thread.currentThread().getName() + " 明天吃土豆牛腩");
	}
}

public class Demo1 {
	public static void main(String[] args) {
		// 1. 创建线程池对象
		ExecutorService service = Executors.newFixedThreadPool(5);
		
		// 2. 创建一个MyThread1 Runnable接口实现类对象、
		MyThread1 target = new MyThread1();
		
		// 3. 使用线程池对象中的一个线程,指定目标代码
		// 初始化线程数为5,这里使用的是线程池中已经存在的5个线程来执行代码
		service.submit(target);
		service.submit(target);
		service.submit(target);
		service.submit(target);
		service.submit(target);
		
		// 因为原本的5个线程都在被使用中,这里需要等待5个线程执行完毕,出现空闲线程
		// 来执行对应的目标代码
		service.submit(target);
		service.submit(target);
		
		// 4. 关闭线程池
		// 一般不用关闭线程池,会随着程序的退出而关闭
		// service.shutdown();
	}
}

2. Lambda表达式

2.1 Lambda表达式思路

service.submit(new Runnable() {                                          
	@Override                                                
	public void run() {                                      
		System.out.println(Thread.currentThread().getName());
	}                                                        
});                                                          

匿名内部类方式来作为线程池执行目标代码
1. 这个方法需要的参数是Runnable接口的实现类对象
2. Runnable接口目标是为了提供一个run 方法, What will be run
3. What will be run??? where??? run方法内容

这里需要Runnable提供Run方法,提供Run方法方法体

“说重点”
需要Run方法方法体

2.2 Lambda表达式格式

service.submit(() -> System.out.println(Thread.currentThread().getName())); 

( ) -> System.out.println(Thread.currentThread().getName())
Lambda表达式

( ) 参数列表
-> 做什么事情,就是对应方法体
箭头之后的代码就是正常语句

(参数列表) -> {代码语句}

2.3 Lambda表达式使用前提

  1. 有且只有一个缺省属性为public abstract方法的接口,例如 Comparator接口,Runnable接口
  2. 使用lambda表达式是有一个前后要求约束的
    方法的参数为接口类型,或者说局部变量使用调用方法,可以使用lambda也OK
  3. 有且只有一个抽象方法的接口,称之为【函数式接口】

你可能感兴趣的:(java)