java笔记
多线程并发
无论是继承Thread类重写run()方法、实现函数式接口Runnable的run()方法、实现函数式接口Callable的V call()方法。其底层代码都是调用java的Thread类的start()方法开启多线程。
方式一:不使用线程池启动
-
继承Thread类方式
public class ThreadA extends Thread{ @Override public void run(){ System.out.println("继承Thread类方式-多线程启动"); } } public static void main(String[] args) throws Exception{ //启动线程 new ThreadA().start();
-
实现函数式接口Runnable方式
//实现run方法 Runnable runnable = new Runnable(){ @Override public void run(){ System.out.println("实现run方法-不带返回值"); } }; //开启多线程 new Thread(runnable).start();
-
实现函数式接口Callable方式
//使用泛型。因此方法带返回值,这里指定了String类型 Callable<String > callableStr = new Callable<String >(){ @Override public String call(){ return "带返回值,有回调函数"; } }; //因为需要含有run方法,但是此Callable接口没有run。所以需要使用FutureTask类封装一下 FutureTask<String> stringFutureTask = new FutureTask<>(callableStr); //启动多线程 new Thread(stringFutureTask).start(); //检测执行结果,回调函数 String result = stringFutureTask.get();
方式二:使用Executors线程池启动
线程池创建分为4种:
*1、newCachedThreadPool创建一个可缓存线程池
*2、newFixedThreadPool 创建一个定长线程池
*3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
*4、newSingleThreadExecutor 创建一个单线程化的线程池
-
创建线程池
//创建缓存类型线程池 ExecutorService es = Executors.newCachedThreadPool();
-
执行不含返回值的线程
//创建线程 使用lambda,也可使用匿名类 Runnable runFun = ()->{ System.out.println("可以是Thread继承类或者Runnable实现类"); }; //启动多线程。此方法只接收Runnable接口类型。(只接受含有run方法的类) es.execute(runFun);
-
执行含返回值的线程
//创建Callable线程 Callable<String > stringCallable = ()->{ return "执行call方法,并返回值"; }; //开启线程 Future<String> future = es.submit(stringCallable); //回调函数,获取返回值 String results = future.get();