Java中如何实现多线程,创建并开启新的线程

这篇具有很好参考价值的文章主要介绍了Java中如何实现多线程,创建并开启新的线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


提示:以下是本篇文章正文内容,Java系列学习将会持续更新

一、创建任务和线程的方式

1.Java线程在代码中是如何体现的
  java.lang.Thread类(包括其子类)的一个对象 Thread——线程
2.如何在代码中创建线程(最基本) Runnable——让这个线程去完成的工作 (任务)
  ①先创建任务类,并实现Runhable接口。
   创建任务类对象。
   创建Thread对象,并将任务类对象传入其中。

  ②创建任务类对象直接继承Thread类。
   实例化该任务类对象。

  ③直接创建Thread对象,并实现Runnable接口。
3.启动线程
  调用Thread对象的start()方法。
  我们写的无论是Thread的子类还是Runnable的实现类,只是给线程启动的“程序”。
  所以,同一个程序,可以启动多个线程。

二、三种方式的代码实现

方法一:通过实现Runnable接口创建线程

public class Achieve_Runnable {
    public static void main(String[] args) {
		
		// Thread实例中传入任务类
        Runnable task1 = new PrintA();
        Thread t1 = new Thread(task1);

        // 以匿名内部类的方式实现Runnable接口
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.print("* ");
                }
            }
        });

        // 以lamoda表达式的方式实现Runnable接口
        Thread t3 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.print("$ ");
            }
        });

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

class PrintA implements Runnable {
    @Override
    public void run() {
        // 打印100个A
        for (int i = 0; i < 100; i++) {
            System.out.print("A ");
        }
    }
}

回到目录…

方法二:通过继承Thread类创建线程

public class Extend_Thread {
    public static void main(String[] args) {
        Thread t = new PrintOne();
        t.start();
    }
}

class PrintOne extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.print(1 + " ");
        }
    }
}

回到目录…

方法三:使用Callable和Future来创建线程

注意:和Runnable接口不一样,Callable接口提供了一个call()方法来作为线程的执行体,call()方法比run()方法功能要更加强大,call()方法可以有返回值,call()方法可以声明抛出异常(前两种如果要抛异常只能通过try-catch来实现)。

步骤

  1. 创建Callable接口的实现类,并实现call()方法,然后创建该类的实例
  2. 使用FutureTask类来包装Callable对象。该FutureTask对象封装了Callable对象的call()方法的返回值
  3. 使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口并在重写的run方法中执行call方法)
  4. 调用FutureTask对象的get方法来获取线程执行结束后的返回值
import java.util.concurrent.*;

class PrintA implements Callable {
    @Override
    public String call() throws Exception {
        for (int i = 0; i < 100; i++) {
            System.out.print("A ");
        }
        return "yes";
    }
}

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

        Callable callable = new PrintA();
        FutureTask futureTask = new FutureTask(callable);
        Thread t = new Thread(futureTask);

        // 启动线程
        t.start();
        // 输出返回值
        System.out.println(futureTask.get());
    }
}

回到目录…

方法四:通过线程池来创建线程

public class Main {
    public static void main(String[] args) {
        // 定长线程池
        ExecutorService service1 = Executors.newFixedThreadPool(30);
        // 定时线程池
        ExecutorService service2 = Executors.newScheduledThreadPool(30);
        // 可缓存线程池
        ExecutorService service3 = Executors.newCachedThreadPool();
        // 单线程化线程池
        ExecutorService service4 = Executors.newSingleThreadExecutor();
        // 自定义线程池
        ExecutorService service5 = new ThreadPoolExecutor(10, 30, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(30));
    }
}

回到目录…

三、Java中何时会出现线程调度?

1.CPU空闲
  1.当前运行着的CPU执行结束了  运行->结束
  2.等待外部条件  运行->阻塞
  3.主动放弃  运行->就绪
2.被调度器主动调度
  1.高优先级线程抢占
  2.时间片耗尽(这个情况最常见)

四、线程和方法调用栈

:当前执行流在当前时刻的状态框(方法调用的次序)。
栈帧:运行方法时所需要的一些临时数据。
每个线程都有自己独立的调用栈。
Java中如何实现多线程,创建并开启新的线程
程序=指令+数据
  调用的是同一个方法:说明执行的是同一批指令,把两个数相加并返回
  栈不同(帧不同) :说明执行指令时,要处理的数据是不同
      main: 10 + 20
      sub:1+2
Java中如何实现多线程,创建并开启新的线程

回到目录…


总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是Java多线程与并发的学习,介绍Java中创建并开启线程的三种方式、了解方法调用栈。之后的学习内容将持续更新!!!
文章来源地址https://www.toymoban.com/news/detail-410993.html

到了这里,关于Java中如何实现多线程,创建并开启新的线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git 如何创建新的远程分支,并将本地代码 push 到新的分支

    1、可以通过git branch -r 命令查看远端库的分支情况 2、从已有的分支创建新的分支(如从master分支),创建一个 duanjiwang 分支 但此时并没有在远程仓库上创建分支 如图所示 还是只有一个 master 分支 3、建立本地到远端仓库的链接 --这样代码才能提交上去 使用命令行 4、git 强制提交

    2024年02月12日
    浏览(60)
  • 【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 线程 : 线程是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。 生

    2024年02月08日
    浏览(57)
  • Golang 如何基于现有的 context 创建新的 context?

    目录 基于现有的 context 创建新的 context 现有创建方法的问题 Go 1.21 中的 context.WithoutCancel 函数 Go 版本低于 1.21 该怎么办? 在 Golang 中,context 包提供了创建和管理上下文的功能。当需要基于现有的 context.Context 创建新的 context 时,通常是为了添加额外的控制信息或为了满足特

    2024年01月17日
    浏览(39)
  • idea 2023.3.2版本如何创建新的maven项目

    1.首先点击new--project  2.填写相关项目名,存放的地址等  3.创建后的效果 4.添加maven依赖,若依赖一直下载不下来,注意在setting中配置一下maven(根据自己的情况配置)以及jdk等     根据自己的实际安装地址,进行maven相关配置 配置jdk  配置jre 5.创建下的maven项目没有Resour

    2024年02月15日
    浏览(37)
  • 探讨Java多线程调度:如何实现两线程并行,一线程等待?

    亲爱的小伙伴们,大家好!我是小米,很高兴再次和大家分享一些关于Java编程的有趣技巧和知识。今天,我们将探讨一个有趣且常见的面试问题:如何让两个线程同时执行,而第三个线程必须等待前两个线程结束后才能开始执行呢?这是一个非常实用的问题,也是我们在多线

    2024年02月08日
    浏览(40)
  • react后端开发:如何根据特定ID创建新的用户信息?

    以音乐app开发为例,我们想要在想要创建新的唱片库,就需要使用Post连接服务器端新建唱片ID,并在该ID处插入唱片信息。怎么做呢? 使用create同时创建id和唱片信息 不过在这之前,我们一般先需要进行判断,新写入的唱片是否存在,比如某用户已经上传了周杰伦的青花瓷,

    2024年01月23日
    浏览(53)
  • 什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

    前面我们了解了什么是进程以及如何实现进程调度,那么今天我将为大家分享关于线程相关的知识。在学习线程之前,我们认为进程是操作系统执行独立执行的单位,但其实并不然。线程是操作系统中能够独立执行的最小单元。只有掌握了什么是线程,我们才能实现后面的并

    2024年02月13日
    浏览(38)
  • java中线程池是如何实现复用的?

    Java 中线程池实现线程复用的核心机制在于通过维护一定数量的核心线程和可扩展的工作队列来处理任务。线程复用的过程可以分为以下几个步骤: 核心线程复用: 线程池会维护一定数量的核心线程,这些线程在处理任务时会一直保持存活,不会被回收。当有新任务提交时,

    2024年02月04日
    浏览(49)
  • JAVA 使用stream流将List中的对象某一属性创建新的List

    Java Stream是Java 8引入的一种新机制,它可以让我们以声明式方式操作集合数据,提供了更加简洁、优雅的集合处理方式。Stream是一个来自数据源的元素队列,并支持聚合操作。它的特点有: Stream 不会修改原始数据源。 Stream 操作是延迟执行的。 Stream 操作可以是无限的(比如

    2024年02月03日
    浏览(54)
  • 【JavaEE】什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

    前面我们了解了什么是进程以及如何实现进程调度,那么今天我将为大家分享关于线程相关的知识。在学习线程之前,我们认为进程是操作系统执行独立执行的单位,但其实并不然。线程是操作系统中能够独立执行的最小单元。只有掌握了什么是线程,我们才能实现后面的并

    2024年02月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包