欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 039 三种实现多线程的方式

039 三种实现多线程的方式

2025/2/24 4:00:38 来源:https://blog.csdn.net/m0_46695127/article/details/143739266  浏览:    关键词:039 三种实现多线程的方式

文章目录

    • 继承Thread类实现多线程
    • 实现Runnable接口实现多线程
    • Callable + FutureTask实现多线程

继承Thread类实现多线程

package com.xd.cubemall.juc;import lombok.extern.slf4j.Slf4j;/*** 1) 继承Thread类,实现多线程* extends Thread* 2) 实现Runnable接口,实现多线程* 3) FutureTask实现多线程*/
@Slf4j
public class ThreadDemo {public static void main(String[] args) {System.out.println("thread...........start........");//创建多线程对象ThreadA threadA = new ThreadA();//开启线程threadA.start();System.out.println("thread...........end........");}//多线程第一种实现方式: extends Threadpublic static  class ThreadA extends Thread{// run是线程执行主体; 多线程业务在run方法中运行@Overridepublic void run() {log.info("继承Thread实现方式......");//业务代码执行int i = 100/3;log.info("业务代码执行结果:{}, 线程名称:{}, 线程ID:{}",i,this.getName(),this.getId());}}}

实现Runnable接口实现多线程

package com.xd.cubemall.juc;import lombok.extern.slf4j.Slf4j;/*** 1) 继承Thread类,实现多线程* extends Thread* 2) 实现Runnable接口,实现多线程* 普通构建方式:*         //创建多线程对象*         Thread02 thread02 = new Thread02();*         Thread thread = new Thread(thread02);**         //开启线程*         thread.start();*  匿名内部类构建方式:*          Runnable runnable = new Runnable() {*             @Override*             public void run() {*                 log.info("实现Runnable接口实现方式......");*                 //业务代码执行*                 int i = 100/3;*                 log.info("业务代码执行结果:{}",i);*             }*         };**         // 创建线程对象*         Thread thread = new Thread(runnable);*         // 开启线程执行*         thread.start();**   lambda表达式构建方式:*           new Thread(()->{*             log.info("实现Runnable接口实现方式......");*             //业务代码执行*             int i = 100/3;*             log.info("业务代码执行结果:{}",i);*         }).start();**   lambda表达式特点:*   1 @FunctionalInterface:此注解表示可以使用lambda表达式的编程方式,此注解相当于是一个标识*   2 接口只有一个方法(必须满足)-- 即使没有上面注解,也可以使用lambda表达式,程序会在后台自动识别*   语法形式:*   方法括号(有参写,无参不写) -> {业务执行方法体}* 3) Callable + FutureTask实现多线程*/
@Slf4j
public class ThreadDemo {public static void main(String[] args) {System.out.println("thread...........start........");new Thread(()->{log.info("实现Runnable接口实现方式......");//业务代码执行int i = 100/3;log.info("业务代码执行结果:{}",i);}).start();System.out.println("thread...........end........");}// 02-实现Runnable接口,实现多线程public static class Thread02 implements Runnable{@Overridepublic void run() {log.info("实现Runnable接口实现方式......");//业务代码执行int i = 100/3;log.info("业务代码执行结果:{}",i);}}
}

在这里插入图片描述

在这里插入图片描述

Callable + FutureTask实现多线程

package com.xd.cubemall.juc;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;/*** 1) 继承Thread类,实现多线程* extends Thread* 2) 实现Runnable接口,实现多线程* 普通构建方式:*         //创建多线程对象*         Thread02 thread02 = new Thread02();*         Thread thread = new Thread(thread02);**         //开启线程*         thread.start();*  匿名内部类构建方式:*          Runnable runnable = new Runnable() {*             @Override*             public void run() {*                 log.info("实现Runnable接口实现方式......");*                 //业务代码执行*                 int i = 100/3;*                 log.info("业务代码执行结果:{}",i);*             }*         };**         // 创建线程对象*         Thread thread = new Thread(runnable);*         // 开启线程执行*         thread.start();**   lambda表达式构建方式:*           new Thread(()->{*             log.info("实现Runnable接口实现方式......");*             //业务代码执行*             int i = 100/3;*             log.info("业务代码执行结果:{}",i);*         }).start();**   lambda表达式特点:*   1 @FunctionalInterface:此注解表示可以使用lambda表达式的编程方式,此注解相当于是一个标识*   2 接口只有一个方法(必须满足)-- 即使没有上面注解,也可以使用lambda表达式,程序会在后台自动识别*   语法形式:*   方法括号(有参写,无参不写) -> {业务执行方法体}** 3) Callable + FutureTask实现多线程* jdk1.5后: 添加callable接口,实现多线程,相较于Thread,runnable接口没有返回值,但是callable接口是有返回值* @FunctionalInterface: 支持lambda表达式写法* public interface Callable<V>:* 1.具有泛型的接口,只有一个方法call,call方法就是多线程执行业务主体,* 2.方法执行完毕后有返回值,返回值类型就是指定的泛型类型* 疑问:多线程执行必须和Thread有关系,callable接口和Thread有什么关系?**** 普通方式*         // 创建对象: 实现了callable接口对象*         Thread03 thread03 = new Thread03();*         // 创建futureTask对象,把thread03对象传递构造函数中*         FutureTask<Integer> task = new FutureTask<Integer>(thread03);**         // 创建多线程对象*         Thread thread = new Thread(task);*         // 开启线程执行*         thread.start();**         // 等待子线程执行结束后,获取返回结果*         try {**             // 同步阻塞,必须等待异步线程执行结束,且返回结果后,再继续往下执行*             Integer integer = task.get();**             System.out.println("子线程执行结果:"+integer);*         } catch (InterruptedException e) {*             e.printStackTrace();*         } catch (ExecutionException e) {*             e.printStackTrace();*         }*** 匿名内部类方式*         Callable<Integer> callable = new Callable<Integer>() {*             @Override*             public Integer call() throws Exception {*                 log.info("实现callable接口实现方式......");*                 //业务代码执行*                 int i = 100/3;*                 log.info("业务代码执行结果:{}",i);*                 return i;*             }*         };****         // 创建futureTask对象,把thread03对象传递构造函数中*         FutureTask<Integer> task = new FutureTask<Integer>(callable);**         // 创建多线程对象*         Thread thread = new Thread(task);*         // 开启线程执行*         thread.start();**         // 等待子线程执行结束后,获取返回结果*         try {**             // 同步阻塞,必须等待异步线程执行结束,且返回结果后,再继续往下执行*             Integer integer = task.get();**             System.out.println("子线程执行结果:"+integer);*         } catch (InterruptedException e) {*             e.printStackTrace();*         } catch (ExecutionException e) {*             e.printStackTrace();*         }** 3 lambda表达式方式*         FutureTask<Integer> task = new FutureTask<Integer>(()->{*             log.info("实现callable接口实现方式......");*             //业务代码执行*             int i = 100/3;*             log.info("业务代码执行结果:{}",i);*             return i;*         });******/
@Slf4j
public class ThreadDemo {public static void main(String[] args) {System.out.println("thread...........start........");// 创建对象: 实现了callable接口对象// 创建futureTask对象,把thread03对象传递构造函数中FutureTask<Integer> task = new FutureTask<Integer>(()->{log.info("实现callable接口实现方式......");//业务代码执行int i = 100/3;log.info("业务代码执行结果:{}",i);return i;});// 创建多线程对象Thread thread = new Thread(task);// 开启线程执行thread.start();// 等待子线程执行结束后,获取返回结果try {// 同步阻塞,必须等待异步线程执行结束,且返回结果后,再继续往下执行Integer integer = task.get();System.out.println("子线程执行结果:"+integer);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println("thread...........end........");}// 03-实现callable接口,实现多线程public static class Thread03 implements Callable<Integer>{// 业务执行主体@Overridepublic Integer call() throws Exception {log.info("实现callable接口实现方式......");//业务代码执行int i = 100/3;log.info("业务代码执行结果:{}",i);return i;}}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com