首页 > 其他分享 >多线程的实现 *

多线程的实现 *

时间:2022-12-18 10:45:53浏览次数:48  
标签:run Thread start 实现 MyCallable 对象 线程 多线程

一 继承Thread类

实现步骤:

定义一个类(MyThread)继承Thread类
在MyThread类中重写run()方法
创建MyThread类的对象
启动线程 (对象名.start();)

1 run()和start()方法的区别

(1) 重写run()方法的原因:

run()是用来封装被线程执行的代码

(2) run()和start()方法的区别:

run():封装线程执行的代码,直接调用,相当于普通方法的调用,并没有开启线程。 (顺序执行)

start():启动线程;然后由JVM调用此线程的run()方法 (交替执行)

  • 交替:并不是某一个线程执行完了再执行另外一个线程,也不是ABAB..
    是看电脑的内部分配,谁先抢到执行权谁就先执行

二 实现Runnable接口(重点)

实现步骤:

定义一个类(MyRunnable)实现Runnable接口
在MyRunnable类中重写run()方法
创建MyRunnable类的对象
创建Thread类的对象,把MyRunnable对象作为构造方法的参数
启动线程 (对象名.start();)

  • 使用自定义类实Runnable接口比继承Thread类更加有优势
    类可以多实现(拥有多个接口的功能),但是只能单继承(只能拥有一个类的功能)多实现的拓展性就更强。

三 实现Callable接口(了解)

实现步骤:

定义一个类(MyCallable)实现Callable接口
在MyCallable类中重写call()方法
创建MyCallable类的对象
创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法的参数
创建Thread类的对象,把FutureTask对象作为构造方法的参数
启动线程 (Thread类的对象名.start();)
再调用get方法,就可以获取线程结束之后的结果(call方法的返回值)(FutureTask类的对象名.get)

public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
    for (int i = 0; i < 100; i++) {
        System.out.println("i = " + i);

    }

    return "over";
}
}
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
    //创建自定义线程对象
    MyCallable mc=new MyCallable();
    //创建FutureTask对象(需要传递Callable对象)
    FutureTask<String> task=new FutureTask<>(mc);
    //创建线程类对象
    Thread thread=new Thread(task);
    thread.start();

    for (int j = 0; j < 100; j++) {
        System.out.println("j = " + j);
    }

    //获取call()方法中的返回值数据
    String s = task.get();
    System.out.println(s);
}
}

四 三种实现方式对比

实现Runnable、Callable接口:

  • 好处:扩展性强,实现该接口的同时还可以继承其他的类
  • 缺点:编程相对复杂,不能直接使用Thread类中的方法

继承Thread类:

  • 好处:编程简单,可以直接使用Thread类中的方法
  • 缺点:扩展性较差,不能在继承其他的类
  •  

     

标签:run,Thread,start,实现,MyCallable,对象,线程,多线程
From: https://www.cnblogs.com/Sco-/p/16990066.html

相关文章

  • redis 轻松实现分布式秒杀系统
    redis轻松实现分布式秒杀系统利用redis操作的原子性,轻松实现一个分布式的秒杀系统。假设设计背景:1万人去抢10个商品设计思路:在redis中存储一个list,每次用户请求抢购......
  • 小秒表计时的功能实现
    用DevEco工具首先给main_layout.xml一个按钮一个文本<?xmlversion="1.0"encoding="utf-8"?><DependentLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"oh......
  • mysql 8.0 递归实现菜单树
    mysql8.0递归实现菜单树WITHrecursiverec_menu(id,menu_id,sup_menu,menu_name,`level`,rownum,order_str)AS(SELECTT0.id,T0.menu_id,T0.sup_menu,T0.......
  • golang实现tcp自动重连示例程序
    参考代码:packagemainimport("fmt""net""time")funcdoTask(){time.Sleep(1*time.Second)main()}funcmain(){for{conn,err......
  • 前端开发系列131-进阶篇之Promise源码实现
    title:前端开发系列131-进阶篇之Promise源码实现tags:categories:[]date:2019-10-2701:08:08本文介绍参考[PromiseA+]规范来实现一个符合规范的Promise库。上......
  • 前端开发系列134-进阶篇之脚手架Yue-cli的实现03-download功能
    title:前端开发系列134-进阶篇之脚手架Yue-cli的实现03-download功能tags:categories:[]date:2019-11-0400:00:08这是系列文章前端脚手架实现的第三篇,本文核心解......
  • 将ChatGPT接入微信实现智能回复
    ChatGPT近期以强大的对话和信息整合能力风靡全网,可以写代码、改论文、讲故事,几乎无所不能,这让人不禁有个大胆的想法,能否用他的对话模型把我们的微信打造成一个智能机器人,......
  • python中实现保留几位小数的几种方式
    方式一:format()format(1.235,'.2f')Out[1]:'1.24'format(1.2,'.2f')Out[2]:'1.20'format(1.2,'.3f')Out[3]:'1.200'返回值为字符串类型,末位会自动补0......
  • Excel实现批量插⼊SQL语句
    新建一个Excel数据表将Excel要放置数据的列的单元格格式转化为“文本”格式拷贝数据到Exccl中,这一步要在第二步之后将放置SQL语句的单元格设置为“常规”在放置SQL语......
  • Springboot 实现热部署
    1.spring-boot-devtools(推荐)在pom.xml中添加下面依赖<!--快重启--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devto......