Java之多线程的实现与应用

多线程

创建进程方式:

(1)继承Thread类

class Main {
    public static void main(String[] args) {
MyThread01 myThread01=new MyThread01();
myThread01.start();
while(true){
    System.out.println("main方法的run()方法正在运行");
}
    }
}
​class MyThread01 extends Thread {
    public void run(){
        while(true){
            System.out.println("MyThread01类的run()方法正在运行");
        }
    }
​
}

 

 

0d35a5f27bac60fadb3ba1b8bfc17c56.png

(2)实现Runnable接口

为一个实现了Runnable接口的类创建一个实例化对象。该对象作为参数用来创建thread对象,然后由该对象启动start方法开启新线程。主线程继续执行main()方法。

class Main {
 public static void main(String[] args) {
MyThread01 myThread01=new MyThread01();
Thread thread=new Thread(myThread01);
thread.start();
while(true){
 System.out.println("main方法的run()方法正在运行");
}
 }
}
​class MyThread01 implements Runnable{    public void run(){
        while(true){
            System.out.println("MyThread01类的run()方法正在运行");
        }
    }
​
}
 

 

9f66254923c23cacee6bd5b87b7fdb71.png

使用Lambda表达式实现如下:

使用( )->{  }代替作为实现了接口的类的实例化对象作为参数传入;

class Main {
    public static void main(String[] args) {
​
        Thread thread=new Thread(()->{
            while(true){
                System.out.println("main方法的run()方法正在运行");
            }
        });
        thread.start();
​
    }
}
​
class MyThread01 implements Runnable{
    public void run(){
        while(true){
            System.out.println("MyThread01类的run()方法正在运行");
        }
    }
​
}

(3)实现Callable接口,与实现Runnable接口相比,可以获得返回值。

首先创建一个实现了Callable接口的类MyThread的实例化对象,在该类中重写call()方法返回一个返回值。

然后用FutureTask封装MyThread类的对象,调用有参的Thread方法创建线程对象,由该对象调用start方法启动线程,然后从FutureTask返回返回值。主线程执行main()方法。

FutureTask类的直接接口是RunnableFuture.该接口拓展出Runnable和Future两个接口。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
​
class Main {
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
MyThread01 myThread01=new MyThread01();
        FutureTask<Object> ft=new FutureTask<>(myThread01);
        Thread thread=new Thread(ft);
        thread.start();
        System.out.println(Thread.currentThread().getName()+"的返回结果是"+ft.get());
        int a=3;
        while(a++<7){
            System.out.println(Thread.currentThread().getName()+"的main()方法在运行");
        }
    }
}
​
class MyThread01 implements Callable<Object> {
   public Object call() throws Exception {
       int i=0;
       while(i++<5){
           System.out.println(Thread.currentThread().getName()+"的call()方法正在运行");
       }
​
       return  i;
   }
​
}

 

7efd65896d21e581366a332582279170.png

 

2cfb8e54682df6891403dee5fdcc158e.png

 

应用:售票场景,4个窗口同时发售次日的100张火车票,模拟售票场景

继承Thread类实现售票场景:

 
class Main {
    public static void main(String[] args) {
        new TicketWindow().start();
        new TicketWindow().start();
        new TicketWindow().start();
        new TicketWindow().start();
    }
}
class TicketWindow extends Thread{
    private int tickets=2;
    public void run(){
        while(tickets>0){
            Thread th=Thread.currentThread();
            String name = th.getName();
            System.out.println(name+"在发行第"+tickets--+"张票");
        }
    }
}

 

71c4f061011339f0ba8e2f9952d1d4b6.png

用Thread创建多线程,无法保证正确操作,接下来通过实现Runnable接口方式实现,使用Thread*(Runnable target,String name)方法在创建线程对象同时指定线程名称。

class Main {
    public static void main(String[] args) {
        TicketWindow tw=new TicketWindow();
        new Thread(tw,"窗口1").start();
        new Thread(tw,"窗口2").start();
        new Thread(tw,"窗口3").start();
        new Thread(tw,"窗口4").start();
​
    }
}
class TicketWindow implements Runnable{
​
    private int tickets=100;
    public void run() {
        while(tickets>0){
            Thread thread=Thread.currentThread();
            String name = thread.getName();
            System.out.println(name+"在发行第"+tickets--+"张票");
​
        }
    }
​
​
}
 

 

070f14e201c919ef9f76e5782b75e191.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3 中处理文件上传和响应式更新

Vue 3 中处理文件上传和响应式更新 一、前言1.创建文件上传组件2.解释代码3.在主应用中使用文件上传组件4.总结 一、前言 在现代 web 开发中&#xff0c;文件上传是一个常见需求。本文将详细介绍如何在 Vue 3 中处理文件上传&#xff0c;并确保上传后的文件列表能够响应式更新…

AI视频教程下载-定制GPT:使用您的数据创建一个定制聊天GPT

Custom GPTs_ Create a Custom ChatGPT with Your Data 构建一个定制的GPT&#xff0c;与您自己的数据进行聊天。添加文档&#xff0c;生成图像&#xff0c;并集成API和Zapier。 这门全面的Udemy课程专为那些渴望学习如何创建自己定制版ChatGPT的人设计&#xff0c;以满足他们…

C++:C与C++混合编程

混合编程 为什么需要混合编程 (1)C有很多优秀成熟项目和库&#xff0c;丢了可惜&#xff0c;重写没必要&#xff0c;C程序里要调用 (2)庞大项目划分后一部分适合用C&#xff0c;一部分适合用C (3)其他情况&#xff0c;如项目组一部分人习惯用C&#xff0c;一部分习惯用C 为什么…

HarmonyOS角落里的知识:“开发应用沉浸式效果”

概述 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条。开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 图1 界面元素示意图 开发应用沉浸式效果主要要考虑如下…

心灵馆咨询系统小程序心理咨询平台聊天咨询

心灵馆咨询系统小程序&#xff1a;解锁你的心灵密码 &#x1f496; 心灵之旅的导航者 在繁忙的现代生活中&#xff0c;我们时常会面临各种压力与困惑。心灵馆咨询系统小程序&#xff0c;如同一位贴心的导航者&#xff0c;引领我们探索内心的世界&#xff0c;寻找真正的自我。 …

DDP(Differential Dynamic Programming)算法举例

DDP(Differential Dynamic Programming)算法 基本原理 DDP(Differential Dynamic Programming)是一种用于求解非线性最优控制问题的递归算法。它基于动态规划的思想,通过线性化系统的动力学方程和二次近似代价函数,递归地优化控制策略。DDP的核心在于利用局部二次近似来…

北大医院副院长李建平:用AI解决临床心肌缺血预测的难点、卡点和痛点

2024年6月14日&#xff0c;第六届北京智源大会在中关村展示中心开幕&#xff0c;海内外的专家学者围绕人工智能关键技术路径和应用场景&#xff0c;展开了精彩演讲与尖峰对话。在「智慧医疗和生物系统&#xff1a;影像、功能与仿真」论坛上&#xff0c;北京大学第一医院副院长、…

[经典]原型资源:蚂蚁金服UI模版部件库

部件库预览链接&#xff1a; https://d3ttsx.axshare.com 支持版本: Axrure RP 8 文件大小: 30MB 文档内容介绍 基本部件&#xff1a;表单样式&#xff1a;12款、数据样式&#xff1a;10款、服务样式&#xff1a;6款、导航&#xff1a;5款、业务组件&#xff1a;7款、 模板…

区块链技术与数字货币

1.起源 ➢中本聪(Satoshi Nakamoto), 2008 ➢比特币:一种点对点的电子现金系统 2.分布式账本技术原理 1.两个核心技术&#xff1a; ➢以链式区块组织账本数据实现账本数据的不可篡改 ➢分布式的可信记账机制 2.共识机制&#xff1a;由谁记账 ➢目的&#xff1a; ⚫ 解…

鸿蒙开发系统基础能力:【@ohos.hiTraceMeter (性能打点)】

性能打点 本模块提供了追踪进程轨迹&#xff0c;度量程序执行性能的打点能力。本模块打点的数据供hiTraceMeter工具分析使用。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impor…

AcWing算法基础课笔记——状态压缩DP:蒙德里安的梦想

状态压缩DP 状态是整数&#xff0c;但把它看成二进制数&#xff0c;二进制中每一位是0或1表示不同的情况。 蒙德里安的梦想 291. 蒙德里安的梦想 - AcWing题库 题目 求把 NM&#x1d441;&#x1d440; 的棋盘分割成若干个 1212 的长方形&#xff0c;有多少种方案。 例如…

Java面试题:聚簇索引和非聚簇索引

聚簇索引和非聚簇索引 聚簇索引(聚集索引) 将数据的存储和索引放在一块,索引结构的叶子节点保存了行数据 索引字段必须存在,且只能存在一个 非聚集索引(二级索引) 将数据和索引分开存储,索引结构的叶子节点关联的是对应的主键 索引字段可以存在多个 索引的选取规则 如果…

2024 年 8 款最佳建筑 3D 渲染软件

你现在使用的3D 渲染软件真得适合你吗&#xff1f; 在建筑和室内渲染当中&#xff0c;市面上有许多3D渲染软件可供选择。然而&#xff0c;并不是每款软件都适合你的需求。本指南将重点介绍2024年精选的8款最佳建筑3D渲染软件&#xff0c;帮助你了解不同的选项&#xff0c;并选…

第100+13步 ChatGPT学习:R实现决策树分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现决策树分类 &#xff08;…

SSM宠物领养系统-计算机毕业设计源码08465

目 录 摘要 1 绪论 1.1课题背景及意义 1.2研究现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 …

大模型管理平台:one-api使用指南

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

Go 实现SFTP连接服务

我们将SFTP连接和处理逻辑&#xff0c;以及登录账户信息封装&#xff0c;这样可以在不同的地方重用代码&#xff0c;并且可以轻松地更改登录凭据。下面我将演示如何使用Go语言中的结构体来封装这些信息&#xff0c;并实现一个简单的SFTP服务器&#xff1a; package mainimport…

信息系统项目管理师 | 新一代信息技术

关注WX&#xff1a;CodingTechWork 物联网 定义 The Internet of Things是指通过信息传感设备&#xff0c;按约定的协议&#xff0c;将任何物品与互联网连接&#xff0c;进行信息交互和通信&#xff0c;以实现智能化识别。定位、跟踪、监控和管理的一种网络。物联网主要解决…

采购OLED透明屏指南

一、引言 OLED透明屏作为一种前沿的显示技术&#xff0c;以其独特的透明度和出色的显示效果&#xff0c;受到了众多行业的青睐。在采购OLED透明屏时&#xff0c;需要综合考虑多个因素&#xff0c;以确保选择到符合需求的高质量产品。以下是一份详细的采购OLED透明屏指南&#x…

昇思25天学习打卡营第1天|基本介绍与快速入门

先贴上打卡截图 基本介绍 首先来看基本介绍&#xff0c;昇思MindSpore是华为的一个全场景深度学习框架&#xff0c;属于昇腾AI全栈的一部分。 总体架构如下图所示&#xff08;来自官方学习材料&#xff09; 从对底层多样性硬件适用的Runtime到应用层面的Model Zoo、科学计算…