首页 > 其他分享 >多线程的三种实现方式

多线程的三种实现方式

时间:2023-12-14 21:12:38浏览次数:33  
标签:方式 Thread t1 线程 new 三种 多线程 public

1.什么是多线程

有了多线程就可以让程序同时进行多件事情。

2.多线程的作用

提高效率

3.应用场景

只要是想多件事情同时运行就需要用到多线程。

4.并发和并行

并发:在同一时刻,有多个指令在单个cpu上交替运行
并行:在同一时刻,有多个指令在多个cpu上同时运行
并发和并行有可能同时发生

三种实现线程的方式

1.继承 Thread

public class ThreadDemo {
public static void main(String[] args) {
  /*
  * 多线程的第一种启动方式:
  * 1. 自己定义一个类继承Thread
  * 2. 重写run方法
  * 3. 创建子类的对象,并启动线程
  * */
  MyThread t1 = new MyThread();
  MyThread t2 = new MyThread();

  t1.setName("线程1");
  t2.setName("线程2");

  t1.start();
  t2.start();
  }
}

public class MyThread extends Thread{

  @Override
  public void run() {
  //书写线程要执行代码
  for (int i = 0; i < 100; i++) {
  System.out.println(getName() + "HelloWorld");
  }
  }
}

2.实现Runnable接口

public class ThreadDemo {
  public static void main(String[] args) {
    /*
    * 多线程的第二种启动方式:
    * 1.自己定义一个类实现Runnable接口
    * 2.重写里面的run方法
    * 3.创建自己的类的对象
    * 4.创建一个Thread类的对象,并开启线程
    * */


    //创建MyRun的对象
    //表示多线程要执行的任务
    MyRun mr = new MyRun();

    //创建线程对象
    Thread t1 = new Thread(mr);
    Thread t2 = new Thread(mr);

    //给线程设置名字
    t1.setName("线程1");
    t2.setName("线程2");

    //开启线程
    t1.start();
    t2.start();
  }
}

 

public class MyRun implements Runnable{

  @Override
  public void run() {
  //书写线程要执行的代码
  for (int i = 0; i < 100; i++) {
  //获取到当前线程的对象
  /*Thread t = Thread.currentThread();

  System.out.println(t.getName() + "HelloWorld!");*/
  System.out.println(Thread.currentThread().getName() + "HelloWorld!");
  }
  }
}

3.实现Callable接口

public class ThreadDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {

    /*
    * 多线程的第三种实现方式:
    * 特点:可以获取到多线程运行的结果
    *
    * 1. 创建一个类MyCallable实现Callable接口
    * 2. 重写call (是有返回值的,表示多线程运行的结果)
    *
    * 3. 创建MyCallable的对象(表示多线程要执行的任务)
    * 4. 创建FutureTask的对象(作用管理多线程运行的结果)
    * 5. 创建Thread类的对象,并启动(表示线程)
    * */

    //创建MyCallable的对象(表示多线程要执行的任务)
    MyCallable mc = new MyCallable();
    //创建FutureTask的对象(作用管理多线程运行的结果)
    FutureTask<Integer> ft = new FutureTask<>(mc);
    //创建线程的对象
    Thread t1 = new Thread(ft);
    //启动线程
    t1.start();

    //获取多线程运行的结果
    Integer result = ft.get();
    System.out.println(result);

  }
}

 

import java.util.concurrent.Callable;

public class MyCallable implements<Integer> {

    @Override
    public Integer call() throws Exception {
    //求1~100之间的和
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
    sum = sum + i;
    }
    return sum;
  }
}

标签:方式,Thread,t1,线程,new,三种,多线程,public
From: https://www.cnblogs.com/haoming-1/p/17901971.html

相关文章

  • 当你用neovim的mason插件管理lsp config,并且配置好bash的bashls后,却没有正常工作的解
    刚开始遇到这个情况我百思不得其解,检查了neovimcheckhealth,以为是npm包管理的问题,然后删了下删了下不但没有解决还把包管理整乱了……后来发现是我没仔细看bash-language-server这个包的官方文档。。。以下是bash-language-server的官方仓库:https://github.com/bash-lsp/......
  • 静态方法注入service的部分方式
    util注入service整理后续如果有新的办法再加进来在如Util等静态方法中调用Service或mapper,初始化后会出现空指针异常:java.lang.NullPointerException。代码执行优先级的问题,在一个Java类中,存在着静态代码块,静态方法,构造函数,成员方法等等。不同形式的代码执行顺序不同:执行顺序......
  • pytorch减少显存方式
     引导1.显存都用在哪儿了?2.技巧1:使用就地操作3.技巧2:避免中间变量4.技巧3:优化网络模型5.技巧4:减小BATCH_SIZE6.技巧5:拆分BATCH7.技巧6:降低PATCH_SIZE8.技巧7:优化损失求和9.技巧8:调整训练精度10.技巧9:分割训练过程11.技巧10:清理内存垃圾12.......
  • 量子计算对密码学的威胁及应对方式
    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。当量子计算机问世时,许多加密方式将慢慢失去效果。本文将阐述原因以及正在研究的后量子密码学,以帮助人们适应后量子时代的密码学。量子计算机的......
  • Java实现异步的几种方式
    普通线程实现异步,但频繁创建、销毁线程比较耗资源,所以一般交给线程池执行//创建需要异步执行的逻辑publicclassAsyncThreadimplementsRunnable{@Overridepublicvoidrun(){System.out.println("异步线程开始");longstart=System.current......
  • Python多线程计算的方法及示例代码
    Python是一种非常流行的编程语言,支持多种并发编程的方式,其中包括多线程。多线程允许程序同时执行多个任务,从而提高了程序的运行效率。下面将介绍Python中多线程计算的几种常见方法,并给出具体的示例代码。方法一:使用标准库threadingPython标准库中提供了threading模块,通过创建Thread......
  • 解决.net core开发过程中端口总是无缘无故被占用的问题,提示SocketException: 以一种访
    先给出原因和方案:  是Hyper-V每次启动随机保留端口段,导致所要使用的端口被系统保留,导致无法使用的问题解决方法就是,指定系统保留端口的范围,避开开发时使用的端口即可。powershell管理员身份使用下面的命令设置。netshintipv4setdynamictcpstart=49152nu......
  • 【Quarkus】quarkus框架获取配置的几种方式
    翻源码可以发现读取接口org.eclipse.microprofile.config.spi.ConfigSourceProvider实现类//从环境变量中读取io.smallrye.config.DotEnvConfigSourceProvider//classpath中读取application.propertiesio.quarkus.runtime.configuration.ApplicationPropertiesConfi......
  • python 文件下载快速、安全和简单的方式
    Python文件下载是指使用Python编写的程序来下载文件。给出一个使用urllib库实现文件下载的示例代码:上面的代码中,url变量表示要下载的文件的URL,save_path变量表示文件保存的路径,最后使用urllib.request)函数来下载文件。Python文件下载是指使用Python编写的程序来下载文件。给出一个......
  • 软件测试/人工智能|selenium元素定位方式大全
    前言当我们在使用selenium进行自动化测试工作时,元素定位是非常重要的一环,因为我们是借助脚本模拟我们通过鼠标和键盘对元素进行点击、输入内容和滑动操作的,所以准确的元素定位是我们执行测试脚本的重要一环。本文就来给大家介绍一下selenium的元素定位方式。find_element和find......