目录
一、继承Thread类的方式
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;/**
* @description: 创建多线程的方式:1、继承Thread类的方式
* @author: xiaozhi
* @create: 2020-07-08 09:39
*/publicclassDemo1extendsThread{privateint count=5;@Overridepublicvoidrun(){for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+"正在运行。。。。。");try{
Thread.sleep(500);}catch(InterruptedException e){
e.printStackTrace();}}}publicstaticvoidmain(String[] args){
Thread thread1=newThread(newDemo1());
Thread thread2=newThread(newDemo1());
thread1.start();
thread2.start();}}
2、输出结果如下:
二、实现Runnable接口的方式
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;/**
* @description: 创建多线程的方式:2、实现Runnable接口的方式
* @author: xiaozhi
* @create: 2020-07-08 09:32
*/publicclassDemo2implementsRunnable{@Overridepublicvoidrun(){for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+"正在运行。。。。");try{
Thread.sleep(500);}catch(InterruptedException e){
e.printStackTrace();}}}publicstaticvoidmain(String[] args){
Thread t1=newThread(newDemo2());
Thread t2=newThread(newDemo2());
t1.start();
t2.start();}}
2、输出结果如下:
三、匿名内部类的方式
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;/**
* @description: 创建多线程的方式:3、匿名内部类的方式
* @author: xiaozhi
* @create: 2020-07-08 09:48
*/publicclassDemo3{//第一种情况:匿名内部类继承Thread类创建线程的方式publicstaticvoidtest1(){newThread(){@Overridepublicvoidrun(){for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+"=====匿名内部类继承Thread类创建线程的方式");}}}.start();}//第二种情况:匿名内部类实现Runnable接口创建线程的方式publicstaticvoidtest2(){newThread(newRunnable(){@Overridepublicvoidrun(){for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+"=====匿名内部类实现Runnable接口创建线程的方式");}}}).start();}//第三种情况:匿名内部类中继承Thread类创建线程的方式同时又实现Runnable接口创建线程的方式//输出的结果以继承Thread类中的结果为准。publicstaticvoidtest3(){newThread(newRunnable(){@Overridepublicvoidrun(){for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+"---------->实现Runnable接口创建线程的方式");}}}){@Overridepublicvoidrun(){for(int i=0; i<5; i++){
System.out.println(Thread.currentThread().getName()+"---------->继承Thread类创建线程的方式");}}}.start();}publicstaticvoidmain(String[] args){test1();test2();test3();}}
2、输出结果如下:
四、带返回值的方式
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/**
* @description: 创建多线程的方式:4、带返回值的方式
* @author: xiaozhi
* @create: 2020-07-08 10:15
*/publicclassDemo4implementsCallable<Integer>{//重写call方法,call方法内计算求和@Overridepublic Integercall()throws Exception{int count=0;for(int i=0;i<10;i++){
count+=i;
System.out.println("正在计算求和:"+count);}return count;}publicstaticvoidmain(String[] args)throws ExecutionException, InterruptedException{
Demo4 d=newDemo4();
FutureTask<Integer> futureTask=newFutureTask<Integer>(d);
Thread thread=newThread(futureTask);
thread.start();
Integer result= futureTask.get();//获取线程的返回值
System.out.println("线程执行的结果:"+result);}}
2、输出结果如下:
五、定时器方式
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;import java.util.Timer;import java.util.TimerTask;/**
* @description: 创建多线程的方式:5、定时器方式
* @author: xiaozhi
* @create: 2020-07-08 10:33
*/publicclassDemo5{publicstaticvoidmain(String[] args){
Timer timer=newTimer();
timer.schedule(newTimerTask(){@Overridepublicvoidrun(){//实现定时任务
System.out.println("每隔一秒执行一次");}},0,1000);}}
2、输出结果如下:
六、线程池的方式
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;import java.util.concurrent.Executor;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/**
* @description: 创建多线程的方式:6、线程池的方式
* @author: xiaozhi
* @create: 2020-07-08 13:42
*/publicclassDemo6{publicstaticvoidmain(String[] args){//创建一个固定大小的线程池
Executor threadPool= Executors.newFixedThreadPool(10);for(int i=0;i<20;i++){//在将来的某个时间执行给定的命令。命令可以在新线程、池线程或调用中执行线程
threadPool.execute(newRunnable(){@Overridepublicvoidrun(){
System.out.println(Thread.currentThread().getName());}});}//在之前提交的文件中启动有序关机执行任务,但不接受新任务。如果已经关闭,调用没有额外的影响((ExecutorService) threadPool).shutdown();}}
2、输出结果如下:
七、Spring实现多线程(Spring的异步任务)
1、模拟示例代码如下:
1)、创建maven项目并且pom文件中引入spring-context依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.0.RELEASE</version></dependency>
2)、创建配置类
package com.rf.springboot01.concurrentAndThread.t3;import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.AsyncConfigurer;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;/**
* @description:
* @author: xiaozhi
* @create: 2020-07-08 13:57
*/@Configuration@ComponentScan("com.rf.springboot01.concurrentAndThread.t3")@EnableAsyncpublicclassDemo7ConfigimplementsAsyncConfigurer{//注册执行器@Overridepublic ExecutorgetAsyncExecutor(){
ThreadPoolTaskExecutor taskExecutor=newThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(10);
taskExecutor.setMaxPoolSize(80);
taskExecutor.setQueueCapacity(100);
taskExecutor.initialize();//如果不初始化,导致找到不到执行器return taskExecutor;}// 用于捕获异步异常@Overridepublic AsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler(){return null;}}
3)、创建service类
package com.rf.springboot01.concurrentAndThread.t3;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;/**
* @description:
* @author: xiaozhi
* @create: 2020-07-08 14:03
*/@ServicepublicclassDemo7Service{@Asyncpublicvoida(){for(int i=0;i<5;i++){
System.out.println("a......");try{
Thread.sleep(1000);}catch(InterruptedException e){
e.printStackTrace();}}}@Asyncpublicvoidb(){for(int i=0;i<5;i++){
System.out.println("b。。。");try{
Thread.sleep(1000);}catch(InterruptedException e){
e.printStackTrace();}}}}
4)、创建测试类
package com.rf.springboot01.concurrentAndThread.t3;import org.springframework.context.annotation.AnnotationConfigApplicationContext;/**
* @description: 创建多线程的方式:7、Spring的异步任务
* @author: xiaozhi
* @create: 2020-07-08 14:06
*/publicclassDemo7Test{publicstaticvoidmain(String[] args){
AnnotationConfigApplicationContext applicationContext=newAnnotationConfigApplicationContext(Demo7Config.class);
Demo7Service ds= applicationContext.getBean(Demo7Service.class);
ds.a();
ds.b();}}
2、输出结果如下:
八、lambda表达式方式(jdk1.8提供的lambda表达式进行并行计算)
1、模拟示例代码如下:
package com.rf.springboot01.concurrentAndThread.t2;import java.util.Arrays;import java.util.List;/**
* @description: 创建多线程的方式:8、jdk1.8提供的lambda表达式进行并行计算
* @author: xiaozhi
* @create: 2020-07-08 15:14
*/publicclassDemo8{publicintadd(List<Integer> list){
System.out.println("stream方法串行执行开始,每一个值输出的顺序是确定的");
list.stream().forEach(System.out::println);
System.out.println("parallelStream方法并行执行开始,每一个值输出的顺序是不确定的");
list.parallelStream().forEach(System.out::println);
System.out.println("parallelStream方法并行执行,并且使用forEachOrdered方法排序开始");
list.parallelStream().forEachOrdered(System.out::println);return list.parallelStream().mapToInt(a->a).sum();}publicstaticvoidmain(String[] args){
List<Integer> list= Arrays.asList(10,20,30,40);int result=newDemo8().add(list);
System.out.println("计算结果为:"+result);}}
2、输出结果如下: