8、多线程

news2024/11/18 17:37:53

文章目录

  • 8、多线程
    • 8.1 线程中的进程
    • 8.2 进程中的线程
    • 8.3 自己的第一个线程
    • 8.4 线程的生命周期
    • 8.5 线程执行方式(串行和并发)
    • 8.6 线程休眠
    • 8.7 工作
    • 8.8 线程池
    • 8.9 同步
    • 8.10 wait和sleep
    • 8.11 线程安全问题


Java零基础极速入门-讲师:海波

失败,是正因你在距成功一步之遥的时候停住了脚步。


8、多线程

8.1 线程中的进程

// 用户的程序就是一个进程,正在运行的程序,不是正在执行的程序,抢到cpu的执行全才是正在执行的程序。
// 进程的名字就是执行的类的名字

查看java中的进程

C:\Users\85411>jps
567920
593984 Jps
570212 RemoteMavenServer36
592084 Launcher

8.2 进程中的线程

public class Demo {
    public static void main(String[] args) {
        // 线程
        // currentThread()获取当前运行的线程
        Thread thread = Thread.currentThread();
        // getName() 用于获取线程的名字
        System.out.println(thread.getName());
        // main方法运行在main线程中
        
        // 1.Java程序在运行的时候默认就会产生一个进程
        // 2.这个进程会有一个主线程
        // 3.代码都在主线程中执行
    }
}

8.3 自己的第一个线程

public class Demo {
    public static void main(String[] args) {
        // 线程
        // currentThread()获取当前运行的线程
        Thread thread = Thread.currentThread();
        // getName() 用于获取线程的名字
        System.out.println(thread.getName());

        // 创建线程
        MyThread t = new MyThread();
        // 启动线程
        t.start();
    }
}
class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("Thread:"+Thread.currentThread().getName());
    }
}

8.4 线程的生命周期

在这里插入图片描述

/**
 *  NEW :新建
 *  RUNNABLE :可运行
 *  BLOCKED :阻塞
 *  WAITING :等待
 *  TIMED_WAITING :定时等待
 *  TERMINATED :终止
 */

8.5 线程执行方式(串行和并发)

串行执行:多个线程连接成串,然后按照顺序执行。

public class Demo {
    public static void main(String[] args) throws Exception {

        // 创建线程
        MyThread1 t1 = new MyThread1();
        MyThread2 t2 = new MyThread2();
        t1.start();
        t2.start();
        // join()当前线程执行完,在执行其他线程。
        t1.join();
        t2.join();
        
        // currentThread()获取当前运行的线程
        Thread thread = Thread.currentThread();
        // getName() 用于获取线程的名字
        System.out.println(thread.getName());
    }
}
class MyThread1 extends Thread{
    @Override
    public void run() {
        System.out.println("Thread1:"+Thread.currentThread().getName());
    }
}
class MyThread2 extends Thread{
    @Override
    public void run() {
        System.out.println("Thread2:"+Thread.currentThread().getName());
    }
}

并发:多个线程是独立,谁抢到CPU的执行权,谁就能执行。

public class Demo {
    public static void main(String[] args) {

        // 创建线程
        MyThread1 t1 = new MyThread1();
        MyThread2 t2 = new MyThread2();
        t1.start();
        t2.start();

        // currentThread()获取当前运行的线程
        Thread thread = Thread.currentThread();
        // getName() 用于获取线程的名字
        System.out.println(thread.getName());
    }
}
class MyThread1 extends Thread{
    @Override
    public void run() {
        System.out.println("Thread1:"+Thread.currentThread().getName());
    }
}
class MyThread2 extends Thread{
    @Override
    public void run() {
        System.out.println("Thread2:"+Thread.currentThread().getName());
    }
}

8.6 线程休眠

public class Demo {
    public static void main(String[] args) throws Exception {

        // 休眠1秒中,打印一次字符串
        while (true) {
            Thread.sleep(1000);
            System.out.println("main线程执行完毕");
        }
    }
}

8.7 工作

public class Demo {
    public static void main(String[] args) throws Exception {

        // 启动方式一
        MyThread1 thread1 = new MyThread1("1");
        thread1.start();
        // 启动方式二
        MyThread2 thread2 = new MyThread2("2");
        Thread thread = new Thread(thread2);
        thread.start();
        // main线程
        System.out.println("main线程运行结束");

    }
}
// 实现线程方式一
class MyThread1 extends Thread{
    private String name;

    public MyThread1(String name){
        this.name = name;
    }
    @Override
    public void run() {
        System.out.println(name+"线程运行结束");
    }
}
// 实现线程方式二
class MyThread2 implements Runnable{
    private String name;

    public MyThread2 (String name){
        this.name = name;
    }
    @Override
    public void run() {
        System.out.println(name + "线程运行结束");
    }
}

8.8 线程池

在这里插入图片描述

public class Demo {
    public static void main(String[] args) throws Exception {

        // 线程池:现成的容器
        // 线程池会根据需要,在启动时,创建一个或多个线程对象
        // Java中有4种比较常见的线程池
        // 1.创建固定数量的线程对象
        //ExecutorService executorService = Executors.newFixedThreadPool(3);
        // 2.根据需求动态创建线程
        //ExecutorService executorService = Executors.newCachedThreadPool();
        // 3.单一线程
        //ExecutorService executorService = Executors.newSingleThreadExecutor();
        // 4.定时调度线程
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);

        // 开启线程数量
        for (int i = 0; i < 5; i++) {
            executorService.submit(new MyThread2());
        }

    }
}
class MyThread2 implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "线程运行结束");
    }
}

8.9 同步

public class Demo {
    public static void main(String[] args){
        // 多线程访问同步方法时,只能一个一个访问,同步操作
        // new Hashtable<>();
        // synchronized关键字还可以修饰代码块,称之为同步代码块
        /*
                synchronized (用于同步对象){
                    处理逻辑
                }
         */
        Num num = new Num();
        User user = new User(num);
        user.start();
        Bank bank = new Bank(num);
        bank.start();
    }
}
class Num{

}
class Bank extends Thread{
    private Num num;
    public Bank(Num num){
        this.num = num;
    }

    @Override
    public void run() {
        synchronized (num){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("9:00,开始营业,开始叫号");
            num.notifyAll();//唤醒所有等待

        }
    }
}
class User extends Thread{
    private Num num;
    public User(Num num){
        this.num = num;
    }

    @Override
    public void run() {
        synchronized (num){
            System.out.println("我是号码1,银行还没开门,我需要等一会");
            try {
                num.wait();//等待
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("叫到我的号了,该我办业务了");
        }
    }
}

8.10 wait和sleep

public class Demo {
    public static void main(String[] args){
        // 阻塞
        // 1.名字
        //  wait:等待
        //  sleep:休眠
        // 2.从属关系
        //  wait:Object 成员方法
        //  sleep:Thread 静态方法
        // 3.使用方式
        //  wait:只能使用在同步代码中
        //  sleep:可以在任意地方使用
        // 4.阻塞时间
        //  wait:超时时间(会发生错误)
        //  sleep:休眠时间(不会发生错误)
        // 5.同步处理
        //  wait:执行wait方法,其他线程有机会执行当前的同步操作
        //  sleep:执行sleep方法,其他线程没有机会执行当前的同步操作
    }
}

8.11 线程安全问题

public class Demo {
    public static void main(String[] args){
        // 线程安全
        // 多线程在并发执行时,修改了共享内存中共享对象的属性,导致的数据冲突问题。
        User user = new User();

        Thread t1 = new Thread(() ->{
            user.name = "zhangsan";
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(user.name);
        });
        Thread t2 = new Thread(() ->{
            user.name = "lisi";
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(user.name);
        });
        t1.start();
        t2.start();
        System.out.println("main线程");
    }
}
class User{
    String name;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文快速上手Swagger

目录 1.什么是Swagger&#xff1f; 2.Swagger的作用&#xff1f; 3.Swagger的使用方法 &#xff08;1&#xff09;一般是在Spring Boot项目中进行集成&#xff0c;只需在项目中引入springfox-swagger2和springfox-swagger-ui依赖即可 &#xff08;2&#xff09;配置Swaage…

[虚幻引擎][UE][UE5]在UE中画一个线框球,网格连接画球,高阶画球并操控

[虚幻引擎][UE][UE5]在UE中画一个线框球&#xff0c;网格连接画球&#xff0c;高阶画球并操控1.材质法2.绘制调试球体3.网格连接4.高阶画球并操控1.材质法 缺点&#xff1a;是实体的&#xff0c;只能欺骗视觉&#xff0c;实际还是一个实体体积球&#xff0c;往里放东西显示不出…

电磁兼容测试整改

1.1 什么时候需要电磁兼容整改及对策 在设计阶段就应考虑电磁兼容性&#xff0c;将产品生产阶段出现电磁兼容问题可能性减小。最终要通过电磁兼容测试检验其电磁兼容标准的符合性。 由于电磁兼容的复杂性&#xff0c;即使电磁兼容设计问题考虑比较周全&#xff0c;在设计制造…

SpringBoot+AOP+自定义注解,实现日志记录/权限验证

目录自定义注解简介AOP实现日志记录1.导入依赖2.创建自定义注解3.编写切面类4.编写测试接口5.测试AOP实现权限验证1.创建自定义注解2.编写切面类3.编写测试接口&#xff1a;4.测试自定义注解简介 为什么要通过AOP来实现日志记录 在业务处理中&#xff0c;我们经常需要将一些用…

基于springboot家政管理系统

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

Python数据容器--字符串(str)

1、字符串的定义 字符串是字符的容器&#xff0c;一个字符串可以存放任意数量的字符。 如&#xff1a;字符串&#xff1a;“itheima”。 2、字符串的相关操作 2.1 字符串的下标索引取值 从前向后&#xff0c;下标从0开始。从后向前&#xff0c;下标从-1开始。 my_str &quo…

【LeetCode每日一题】——611.有效三角形的个数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 二分查找 二【题目难度】 中等 三【题目编号】 611.有效三角形的个数 四【题目描述】 给定一…

数据库管理-第五十期 半百(20221230)

数据库管理 2022-12-30第五十期 半百1 半百2 展望3 计划总结第五十期 半百 1 半百 不知不觉&#xff0c;来到了第五十期&#xff0c;自从立了flag以后也几乎保持了一周一篇文章的频率&#xff0c;当然不得不承认&#xff0c;文章质量还是参差不齐的&#xff0c;有好几篇还是挺…

海尔智家:科技引领的目的是让用户生活幸福

随着时代发展&#xff0c;科技从未像今天这样影响着每个人的“幸福感”。因为科技&#xff0c;我们的通讯可以“随时随地”&#xff0c;交通出行可以“咫尺之间”&#xff0c;购物消费可以“跨越国界”......每一项引领科技的诞生&#xff0c;都能让用户的幸福生活更进一步。 …

git远程仓库下载以及上传

一、远程仓库 通常我们并不常亲自建立远程仓库&#xff0c;而是委托给『第三方』。 常见的操作是&#xff0c;先在第三方上创建『远程 Git 文档库』&#xff0c;然后复制&#xff08;Clone&#xff09;出一个『本地 Git 文档库』 1、在托管网站上创建远程仓库 常见的代码托管…

CDGA|自然资源数据治理五部曲,实现数据融合关联、共享可用

在自然资源行业&#xff0c;数据治理是自然资源信息化的工作基础&#xff0c;是推进自然资源治理体系和治理能力现代化进程的必经之路。 为积极应对数据治理新要求&#xff0c;着力解决资源分散、质量不齐、关联不高等问题&#xff0c;围绕自然资源治理对象&#xff0c;构建集…

有哪些好用的设备巡检类的软件?

现今许多企业&#xff0c;尤其是制造业&#xff0c;规模日趋机械化、自动化、大型化、高速化和复杂化&#xff0c;对设备巡检工作的要求越加精细。 因此&#xff0c;选择好的设备巡检软件&#xff0c;是设备管理的关键。为企业提供设备巡检的解决方案&#xff0c;确保设备巡检…

2022国内网络安全事件大盘点

转眼又到了年底&#xff0c;回望过去的一年&#xff0c;网络攻击事件依旧层出不穷&#xff0c;尤其以俄乌战争为代表&#xff0c;网络空间俨然已经成了第二战场。再回看国内&#xff0c;网络攻击导致的大规模数据泄露事件不但给企业带来巨额财务和品牌损失&#xff0c;同时随着…

项目实战-----产品经理要做什么?

文章目录写在前面&#xff1a;兴奋地开始干我在AR的第一个彻头彻尾的需求&#xff0c;发现原来产品经理脑袋竟然要转这么多圈&#xff0c;果然是术业有专攻啊~&#xff0c;但是既然要成为一个全栈工程师&#xff0c;我也来挑战一下吧~第一版显示我学的课还有我教的课&#xff0…

数据报告 | 美国民众健康状况和医疗需求研究报告

在美国&#xff0c;自2020年COVID-19流行开始&#xff0c;以数字健康为关键词的医疗领域正在发⽣⾰命性的变化。全球范围发生的疫情&#xff0c;促进了医疗行业的变革与创新。 本研究将从美国医疗费用和民众疾病等方面&#xff0c;对美国民众健康状况和医疗需求进行分析。 |美…

Android Kotlin之Coroutine(协程)详解

协程是一种并发设计模式&#xff0c;您可以在 Android 平台上使用它来简化异步执行的代码。 在 Android 上&#xff0c;协程有助于管理长时间运行的任务&#xff0c;如果管理不当&#xff0c;这些任务可能会阻塞主线程并导致应用无响应。 协程的优点&#xff1a; 轻量 您可以…

【日常系列】LeetCode《22·回溯1》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 112 和 113【剑指 34】 &#xff1a;路径总和 https://leetcode.cn/problems/path-sum/ https://leetcode.cn/problems/path-sum-ii/ 提示1&#xff1a…

一文分析Linux虚拟化KVM-Qemu(概念篇)

说明&#xff1a; KVM版本&#xff1a;5.9.1 QEMU版本&#xff1a;5.0.0 工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 从这篇文章开始&#xff0c;将开始虚拟化的系列研究了&#xff0c;大概会涉及到ARM64虚拟化支持、KVM、QEMU等分析&#xff1b; 虚拟…

小米裁员,我有话说

大家好&#xff0c;我是梦想家Alex 。好久没有为大家分享有关职场人生相关的文章了&#xff0c;最近阳康之后&#xff0c;灵感爆棚&#xff0c;想跟大家好好聊一聊。 如果你问我&#xff0c;近期互联网圈热度最高的事情&#xff0c;我想一定少不了小米和腾讯这两家科技巨头的身…

html实现ip输入框功能代码

伪代码&#xff1a; <style> .login-user {display: flex;color: #000;line-height: 30px; } .login-user input{height: 46px;border-radius: 4px;margin: 0px 4px; } </style><div class"layui-form-item login-user"><inp…