浅识java多线程

news2024/11/26 14:30:31

目录

一 进程和线程定义

二 创建线程的种类

(1)继承java.lang.Thread

(2)实现java.lang.Runnable接口 

三 多线程

(1)继承java.lang.Thread多线程

(2)实现java.lang.Runnable接口多线程 

四 线程的状态

五 线程优先级

六 线程休眠

七 使用线程示例


一 进程和线程定义

        进程:应用程序的执行实例

        线程:CPU调度和分派的基本单位,进程中执行运算的最小单位

二 创建线程的种类

(1)继承java.lang.Thread

        a)定义MyThread类继承Thread类

        b)重写run()方法,编写线程执行体

        c)创建线程对象,调用start()方法启动线程

package org.example.demo01;

//步骤1:定义Demo01类继承Thread类
public class Demo01 extends Thread{
    //步骤2:重写run()方法,编写线程执行体

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        //步骤3:创建线程对象,调用start()方法启动线程
        Demo01 demo01 = new Demo01();
        demo01.start();
    }
}

 

(2)实现java.lang.Runnable接口 

        a)定义MyRunnable类实现Runnable接口

        b)实现run()方法,编写线程执行体

        c)创建线程对象,调用Thread类的start()方法启动线程

package org.example.demo01;

//步骤1:定义MyRunnable类实现Runnable接口
public class Demo03 implements Runnable{
    //步骤2:实现run()方法,编写线程执行体
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        //步骤3:创建线程对象,调用Thread类的start()方法启动线程
        Demo03 demo03 = new Demo03();

        Thread demo03Thread = new Thread(demo03);

        demo03Thread.start();
    }
}

三 多线程

(1)继承java.lang.Thread多线程

        核心要点:多个线程之间存在交替执行,不是真正的并行

package org.example.demo01;

public class Demo02 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }

    public static void main(String[] args) {
        Demo02 a1 = new Demo02();
        Demo02 a2 = new Demo02();
        a1.start();
        a2.start();
    }
}

(2)实现java.lang.Runnable接口多线程 

package org.example.demo01;

public class Demo04 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        Demo04 demo04 = new Demo04();

        Thread myThread01 = new Thread(demo04);
        Thread myThread02 = new Thread(demo04);

        myThread01.start();
        myThread02.start();
    }
}

四 线程的状态

  1. 正常情况下流程:创建状态——》就绪状态——》运行状态——》死亡状态
  2. 异常情况下流程:创建状态——》就绪状态——》运行状态——》阻塞(休眠)状态——》就绪状态——》运行状态——》死亡状态

五 线程优先级

        线程优先级由1~10表示,1最低,默认优先级为5

        优先级高的线程获得CPU资源的概率较大

        但是这个优先级已经被淘汰了,基本上没有人设置这个使用,因为它太过不稳定,比如说优先级为 10 的可能都抢不过优先级为 1 的

package org.example.demo01;

public class Demo05 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        Demo05 demo05 = new Demo05();

        Thread a1 = new Thread(demo05,"第一个线程");
        Thread a2 = new Thread(demo05,"第二个线程");

        System.out.println("默认的线程优先级:"+a1.getPriority());

        a1.setPriority(1);
        a2.setPriority(10);

        System.out.println("第一个线程优先级:"+a1.getPriority());
        System.out.println("第二个线程优先级:"+a2.getPriority());

        a1.start();
        a2.start();
    }
}

六 线程休眠

        核心要点:sleep()可以是线程阻塞【休眠】

package org.example.demo01;

public class Demo06 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i == 6){
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName()+"\t"+i);
        }
    }

    public static void main(String[] args) {
        Demo06 demo06 = new Demo06();
        Thread a1 = new Thread(demo06);
        a1.start();
    }
}

 

七 使用线程示例

同步代码块 synchronized

核心要点:在非集群状态下,使用synchronized可以保持线程的安全,如果是集群状态下,则synchronized会失效

package org.example.demo02;

public class Site implements Runnable{
    private int count = 100;
    private int num = 0;
    @Override
    public void run() {
        while (true){
            synchronized (Site.class) {
                if (count <= 0){
                    break;
                }
                num++;
                count--;
                System.out.println(Thread.currentThread().getName()+"抢到了第"+num+"张票,还剩"+count+"张票");
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package org.example.demo02;

public class Test {
    public static void main(String[] args) {
        Site site = new Site();

        Thread thread1 = new Thread(site,"乔尼");
        Thread thread2 = new Thread(site,"杰洛");
        Thread thread3 = new Thread(site,"大总统");

        System.out.println("**************");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

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

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

相关文章

vmware fusion12共享文件夹到虚拟机window10

文章目录 一、window10虚拟机安装VMware Tools二、MAC配置共享文件夹三、使用 一、window10虚拟机安装VMware Tools vmware fusion—虚拟机----安装VMware Tools–一路下一步 确认安装 双击进行安装 一路下一步&#xff0c;傻瓜式安装 二、MAC配置共享文件夹 设置—系…

2023年高教社杯全国大学生数学建模竞赛参赛事项注意

MathClub数模资源&#xff0c;含专属思路 资源链接&#xff1a;点击这里获取众多数模资料、思路精讲、论文模板latex和word、学习书籍等 2023高教社杯数学建模国赛–赛前准备 一年一度的数学建模国赛要来啦&#xff01;&#xff01;&#xff01;小编仔细阅读了比赛官方网站上…

【Java】线程都有哪几种状态

文章目录 前言传统线程模型&#xff08;操作系统&#xff09;中线程状态Java线程中的状态线程的运行流程 前言 首先我们要知道&#xff0c;在传统&#xff08;操作系统&#xff09;的线程模型中线程被分为五种状态&#xff0c;在java线程中&#xff0c;线程被分为六种状态。 …

使用客户支持自动化,您的电子商务收益稳了

经营电子商务业务涉及处理各种任务&#xff0c;从营销和库存管理到客户支持和数据分析。这些职责的复杂性可能是压倒性的&#xff0c;即使有一个专门的团队。 聊天机器人可以通过指导您的客户完成购买过程并回答他们有关产品的问题来提供更好的体验。例如SaleSmartly&#xff…

房地产推广传单制作攻略,打造让人惊艳的电子传单

随着互联网的发展&#xff0c;传统的纸质传单已经逐渐被电子版传单所取代。电子版传单不仅可以节省成本&#xff0c;还可以更好地展示房产信息。在传统的设计软件中制作电子版传单需要一定的门槛&#xff0c;但是现在有了乔拓云网的后台&#xff0c;设计电子版房产H5传单变得简…

Android——数据存储(二)(二十二)

1. SQLite数据库存储 1.1 知识点 &#xff08;1&#xff09;了解SQLite数据库的基本作用&#xff1b; &#xff08;2&#xff09;掌握数据库操作辅助类&#xff1a;SQLiteDatabase的使用&#xff1b; &#xff08;3&#xff09;可以使用命令操作SQLite数据库&#xff1b; …

RabbitMQ:hello结构

1.在Linux环境上面装入rabbitMQ doker-compose.yml version: "3.1" services:rabbitmq:image: daocloud.io/library/rabbitmq:managementrestart: alwayscontainer_name: rabbitmqports:- 6786:5672- 16786:15672volumes:- ./data:/var/lib/rabbitmq doker-compos…

Vue框架--Vue中的样式绑定

1.Vue绑定class样式属性(内部样式) 这里我们介绍三种Vue关于绑定class属性的操作。 ①.字符串写法:适用于:样式的类名不确定,需要动态指定 ②.数组写法:适用于:要绑定的样式个数不确定、名字也不确定 ③.对象写法:

vscode 调试debug rust代码的时候,中文乱码的解决办法

上次也是同样的问题&#xff0c;解决了。今天又遇到&#xff0c;我还以为是项目代码用了什么高深的地方&#xff0c;其实用chcp 65001&#xff0c;都可以解决。 一种解决方法是&#xff1a; 但建议不要用这种方法&#xff0c;因为会引起其他软件不能用&#xff08;或者出问题…

山西电力市场日前价格预测【2023-09-07】

日前价格预测 预测明日&#xff08;2023-09-07&#xff09;山西电力市场全天平均日前电价为331.72元/MWh。其中&#xff0c;最高日前电价为461.61元/MWh&#xff0c;预计出现在19: 30。最低日前电价为254.50元/MWh&#xff0c;预计出现在12: 45。 价差方向预测 1&#xff1a; 实…

stm32同芯片但不同flash工程更换Device出现报错

目录 1. 问题描述2. 解决方案 1. 问题描述 stm32同芯片但不同flash工程更换Device出现报错 2. 解决方案 更换Device&#xff0c;我是从ZE换为C8&#xff1a; 把这个从HD更换为MD 解决&#xff01;

3D点云处理:Opencv Pcl实现深度图转点云(附源码)

文章目录 0. 测试效果1. 代码实现文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_0. 测试效果 处理结果1. 代码实现 文章中提供的深度图像,深度图像一般以.tiff和.png保存,可以通过Opencv中的

Echarts图表跟随父容器的变化自适应

如果页面中有多个图表 隐藏/展开左边侧边栏echarts图表自适应 <div class"line"><div class"title">制冷站关键参数</div><div id"chartLine1" style"width: 100%;height:85%;"></div></div><…

生成树STP中的概念

在数据结构中&#xff0c;有一个方法叫做最小生成树。有环的我们常称为图。将图中的环破了&#xff0c;就生成了树。在计算机网络中&#xff0c;生成树的算法叫作 STP&#xff0c;全称 Spanning Tree Protocol。 Root Bridge&#xff0c;也就是根交换机。这个比较容易理解&…

卖家福利!第三方物流兼容亚马逊日本站运输管理功能!

亚马逊日本站发布公告称外部解决方案提供商Redo Bong LLC提供的库存和运输管理应用程序 “maru9”中添加了与亚马逊 “Marketplace Shipping Service”兼容的运输管理功能&#xff0c;以下是公告内容&#xff1a; 外部解决方案提供商Redo B…

怎么解决期权手续贵的问题?

在开通50ETF期权交易权限之前&#xff0c;券商可能会要求您参加相关的培训或考试&#xff0c;以确保您了解ETF期权交易的基本概念和交易规则&#xff0c;特别是期权手续费的问题&#xff0c;在你开之前&#xff0c;需要咨询协商价格&#xff0c;符合你的心理预期再去开通&#…

【LeetCode算法系列题解】第61~65题

CONTENTS LeetCode 61. 旋转链表&#xff08;中等&#xff09;LeetCode 62. 不同路径&#xff08;中等&#xff09;LeetCode 63. 不同路径 II&#xff08;中等&#xff09;LeetCode 64. 最小路径和&#xff08;中等&#xff09;LeetCode 65. 有效数字&#xff08;困难&#xff…

线程中的join()、wait() 和 notify()详解及练习题

一、join() Thread 类提供了 join() 方法&#xff0c;用于等待当前线程所调用的其他线程执行完毕。 1、当一个线程调用另一个线程的 join() 方法时&#xff0c;它会被阻塞&#xff0c;直到被调用的线程执行完毕或达到指定的超时时间。 比如&#xff1a;当主线程main中调用了…

手把手教会如何掌握Swagger

文章目录 前言一、Swagger重要组件及作用二、SpringBoot集成Swagger1.环境准备2.配置Swagger3.配置Swagger扫描接口4.配置API分组5.拓展&#xff1a;其他皮肤 三、常用注解1.接口注解2.方法及参数注解3.实体类注解效果如图&#xff1a; ![在这里插入图片描述](https://img-blog…

面向未来的编程方式,做为开发者,很必要了解一下什么是iVX

面向未来的编程方式&#xff0c;做为开发者&#xff0c;很必要了解一下什么是iVX 一前言二什么是传统低代码平台以及传统平台的局限性和作用1.什么是传统低代码平台2.传统平台的局限性 三为什么程序员和技术管理者不太可能接受“低代码”平台&#xff1f;1.低代码的特征2.为什么…