Java编程进阶之:线程池以及Lambda

霸气de小男生 提交于 2020-03-04 18:56:52

在这里插入图片描述
今天给大家讲解下多线程的的用例。希望能帮到大家,请看下面的列子,谢谢!

  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();
}

}

  1. 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表达式使用前提
有且只有一个缺省属性为public abstract方法的接口,例如 Comparator接口,Runnable接口

使用lambda表达式是有一个前后要求约束的
方法的参数为接口类型,
或者说局部变量使用调用方法,方法的参数为接口类型。
可以使用lambda也OK

趣脸书

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!