Java并发多线程编程——创建线程的8种方式

2022-10-07 13:57:26

一、继承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、输出结果如下:
在这里插入图片描述

  • 作者:小志的博客
  • 原文链接:https://wwwxz.blog.csdn.net/article/details/107207168
    更新时间:2022-10-07 13:57:26