Java多线程-(线程的创建,线程安全,线程状态)

news2024/11/17 5:20:38

第一章.创建线程的方式

1.第一种方式_extends Thread

1.定义一个自定义线程类继承Thread
2.重写run方法(run方法是用于设置线程任务的)
3.创建自定义线程类对象
4.调用Thread类中的start方法(start方法:开启线程,jvm自动执行run方法)

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("MyThread...执行了"+i);
        }
    }
}
public class Test01 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();//开启线程,jvm自动执行run方法

        for (int i = 0; i < 10; i++) {
            System.out.println("Main线程...执行了"+i);
        }
    }
}

2.Thread类中的方法

void start() -> 开启线程,jvm自动调用run方法
void run()  -> 设置线程任务,这个run方法是Thread重写的接口Runnable中的run方法
String getName()  -> 获取线程名字
void setName(String name) -> 给线程设置名字
static Thread currentThread() -> 获取正在执行的线程对象(此方法在哪个线程中使用,获取的就是哪个线程对象)   
static void sleep(long millis)->线程睡眠,超时后自动醒来继续执行,传递的是毫秒值  

问题:为啥在main方法中处理异常可以throws,在run方法中处理异常不能throws,只能try?

Thread中的run方法没有抛异常,所以我们重写之后不能throws,只能try

void setPriority(int newPriority)   -> 设置线程优先级,优先级越高的线程,抢到CPU使用权的几率越大,但是不是每次都先抢到
int getPriority()  -> 获取线程优先级
void setDaemon(boolean on)  -> 设置为守护线程,当非守护线程执行完毕,守护线程就要结束,但是守护线程也不是立马结束,当非守护线程结束之后,系统会告诉守护线程人家结束了,你也结束吧,在告知的过程中,守护线程会执行,只不过执行到半路就结束了
static void yield() -> 礼让线程,让当前线程让出CPU使用权
void join() -> 插入线程或者叫做插队线程

3.第二种方式_实现Runnable接口

1.创建自定义线程类,实现Runnable接口
2.重写run方法,设置线程任务
3.利用Thread的有参构造:Thread(Runnable r),创建对象,传递自定义线程类对象
4.调用Thread中的start方法,开启线程

public class Test01 {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread t1 = new Thread(myRunnable, "赵四");
        Thread t2 = new Thread(myRunnable, "广坤");

        t1.start();
        t2.start();
    }
}
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"...执行了"+i);
        }
    }
}

1.继承的方式是有局限性的,因为继承只支持单继承,不能多继承,如果使用继承的方式,这个自定义线程类还有其他的父类,此时就没办法再继承Thread了
    
2.实现的方式没有局限性,如果自定义线程类有父类,它可以直接继承一个父类的同时实现Runnable接口

4.匿名内部类创建多线程

 public static void main(String[] args) {
        /*
          Thread(Runnable r)
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"...执行了"+i);
                }
            }
        },"赵四").start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"...执行了"+i);
                }
            }
        },"刘能").start();
    }

第二章.线程安全

什么时候发生:当多个线程共同操作同一个资源时,会出现线程安全问题
出现的原因:CPU在多个线程之间做高速切换

1.解决线程安全问题的第一种方式(使用同步代码块)

1.格式:
  synchronized(锁对象){
      可能出现线程安全问题的代码 }

2.锁对象:任意对象
3.执行流程:
  线程抢到锁,去执行,其他线程必须在同步代码块中排队等待,等着执行的线程出了同步代码块,相当于释放锁了,其他排队等待的线程才能抢到锁去执行
4.注意:
  想要实现线程安全(线程同步),多个线程之间必须使用同一把锁

public class MyTicket implements Runnable{
    int ticket = 100;

    //创建一个对象,充当锁对象
    Object obj = new Object();

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(100L);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            synchronized (obj){
                if (ticket>0){
                    System.out.println(Thread.currentThread().getName()+"...买了第"+ticket+"张票");
                    ticket--;
                }
            }

        }
    }
}
public class Test01 {
    public static void main(String[] args) {
        MyTicket myTicket = new MyTicket();
        Thread t1 = new Thread(myTicket, "赵四");
        Thread t2 = new Thread(myTicket, "刘能");
        Thread t3 = new Thread(myTicket, "广坤");

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

2.解决线程安全问题的第二种方式:同步方法

2.1.普通同步方法_非静态

1.格式:
  修饰符 synchronized 返回值类型 方法名(形参){
      方法体
      return 结果
  }

2.默认锁:this

 public  void method01(){
        synchronized(this){
            if (ticket>0){
                System.out.println(Thread.currentThread().getName()+"...买了第"+ticket+"张票");
                ticket--;
            }
        }

    }

2.2.静态同步方法

1.格式:
  修饰符 static synchronized 返回值类型 方法名(形参){
      方法体
      return 结果
  }

2.默认锁:当前类.class

public static  void method01(){
        synchronized(MyTicket.class){
            if (ticket>0){
                System.out.println(Thread.currentThread().getName()+"...买了第"+ticket+"张票");
                ticket--;
            }
        }

    }

死锁指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁

第三章.线程状态

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State这个枚举中给出了六种线程状态:

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

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

相关文章

【SSRF漏洞】——gopherus工具伪造

改变的确很难&#xff0c;但结果值得冒险 本文如有错误之处&#xff0c;还请各位师傅指正 目录 一.gopherus概述 二.gopherus安装使用 三.gopherus覆盖的服务 四.使用案例 web359&#xff1a; web360&#xff1a; 一.gopherus概述 Gopherus是一个专为生成Gopher协议Payloa…

Leetcode 每日一题:Count Complete Tree Nodes

写在前面&#xff1a; 今天带来一道 Leetcde Easy 的题&#xff0c;但别觉得我在水帖&#xff0c;这道题目在 Google 的面试题中甚至可以升级到 Leetcode medium to hard 的级别&#xff0c;而今天我要带来的正是他的高阶要求&#xff0c;怎么样利用 Complete Binary Tree 的特…

经典负载调制平衡放大器(LMBA)设计-从理论到ADS仿真

经典负载调制平衡放大器&#xff08;LMBA&#xff09;设计-从理论到ADS仿真 ADS工程下载&#xff1a;经典负载调制平衡放大器&#xff08;LMBA&#xff09;设计-从理论到ADS仿真-ADS工程 参考论文: An Efficient Broadband Reconfigurable Power Amplifier Using Active Load…

华为 HCIP 认证费用和报名资格

在当今竞争激烈的信息技术领域&#xff0c;华为 HCIP认证备受关注。它不仅能提升个人的技术实力与职业竞争力&#xff0c;也为企业选拔优秀人才提供了重要依据。以下将详细介绍华为 HCIP 认证的费用和报名资格。 一、HCIP 认证费用 华为HCIP认证的费用主要由考试费和培训费构成…

似然函数与先验概率、后验概率的关系

似然函数、先验概率、后验概率这三个概念是贝叶斯统计中的核心概念&#xff0c;它们共同描述了如何根据已有数据更新我们对某个事件或参数的认识。下面用简单的语言解释这三个概念&#xff0c;并描述它们之间的关系。 1. 先验概率&#xff08;Prior Probability&#xff09; …

Debian11.9镜像基于jre1.8的Dockerfile

Debian11.9基于jre1.8的Dockerfile编写 # 使用Debian 11.9作为基础镜像 FROM debian:11.9 # 维护者信息&#xff08;建议使用LABEL而不是MAINTAINER&#xff0c;因为MAINTAINER已被弃用&#xff09; LABEL maintainer"caibingsen" # 创建一个目录来存放jre …

vue中v-bind和v-model的区别和应用

1.区别 v-bind&#xff1a; vue2中&#xff0c;v-bind是单向数据绑定&#xff0c;用于动态绑定HTML属性和组件属性&#xff0c;只能将vue实例中的数据同步到HTML元素上&#xff0c;实现数据的动态更新和响应式渲染。v-bind的简写形式使用冒号前缀&#xff08;&#xff1a;&am…

VSCode好用的插件推荐

1. Chinese 将vscode翻译成简体中文 2. ESLint 自动检查规范 3. Prettier - Code formatter 可以自动调整代码的缩进、换行和空格&#xff0c;确保代码风格统一。通过配置&#xff0c;Prettier可以在保存文件时自动格式化代码 https://juejin.cn/post/74025724757198274…

【时间盒子】-【7.标题菜单栏】自定义任务页面顶部的标题菜单栏组件

Tips&#xff1a; media媒体资源的使用&#xff1b; float.json、color.json资源文件的使用&#xff1b; 组件属性的定义。 预览效果&#xff1a; 一、创建组件文件 右击component目录 >> 新建 >> ArkTS File&#xff0c;文件命名为TitleContainer.ets。 Prev…

JZ2440开发板——S3C2440的时钟体系

参考博客 &#xff08;1&#xff09;S3C2440-裸机篇-05 | S3C2440时钟体系详解&#xff08;FCLK、PCLK、HCLK&#xff09; 一、三种时钟&#xff08;FCLK、HCLK、PCLK&#xff09; 如下图所示&#xff0c;S3C2440的时钟控制逻辑&#xff0c;给整个芯片提供三种时钟&#xff1…

通过防火墙分段增强网络安全

什么是网络分段‌ 随着组织规模的扩大&#xff0c;管理一个不断扩大的网络成为一件棘手的事情&#xff0c;同时确保安全性、合规性、性能和不间断的运行可能是一项艰巨的任务。为了克服这一挑战&#xff0c;网络管理员部署了网络分段&#xff0c;这是一种将网络划分为更小且易…

QT::QComboBox自定义左击事件信号

因为QComboBox没有自定义的clink信号&#xff0c;所以自己新建一个MyComBox类继承QComboBox&#xff0c;并且添加自定义的左击信号&#xff0c;以及使用该信号连接一个槽函数 mycombobox.h #ifndef MYCOMBOBOX_H #define MYCOMBOBOX_H#include <QComboBox> #include &l…

使用程序集解析的方式内嵌dll到exe中

选择一个项目&#xff08;demo3&#xff09;&#xff0c;来进行内嵌。正常dll文件是可以在Bin–Debug里面看到的。 在Program里面添加内容 Program.cs里的全部代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Syste…

【面试八股总结】Redis持久化

Redis 实现了数据持久化的机制&#xff0c;这个机制会把数据存储到磁盘&#xff0c;这样在 Redis 重启就能够从磁盘中恢复原有的数据。 Redis 共有三种数据持久化的⽅式&#xff1a; AOF 日志&#xff1a;每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到⼀个文…

7.5图像缩放

实验原理 在OpenCV&#xff08;Open Source Computer Vision Library&#xff09;中&#xff0c;resize函数用于调整图像的尺寸。这个函数非常有用&#xff0c;尤其是在进行图像预处理时&#xff0c;比如在图像识别或机器学习任务中需要统一输入图像的大小。 下面是基于C的re…

Qt与Udp

(1)绑定端口 (2)广播 用udp实现广播通信_udp广播-CSDN博客 数据的发送是面向整个子网的&#xff0c;任何一台在子网中的计算机都可以接收到相同的数据。 如果一台机器希望向其他N台机器发送信息&#xff0c;这时候可以使用UDP的广播。 --------------- 广播地址&#xff1…

大数据-133 - ClickHouse 基础概述 全面了解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

如何编译OpenHarmony SDK API

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 startup子系统之syspara_lite系统属性部件 &#xff08;1&#xff09; startup子系统之syspara_lite系统属性部件 &#xff08;2&#xff09; startup子系…

【数据集】城市不透水面数据集CLUD-Urban

城市不透水面数据集CLUD-Urban 数据概述数据下载参考 数据概述 1、论文-ESSD-A 30 m resolution dataset of China’s urban impervious surface area and green space, 2000–2018 空间分辨率&#xff1a;30 m 数据下载 数据下载&#xff1a;A 30-meter resolution data…

Grafana面板-linux主机详情(使用标签过滤主机监控)

1. 采集器添加labels标签区分业务项目 targets添加labels &#xff08;模板中使用的project标签&#xff09; … targets: [‘xxxx:9100’] labels: project: app2targets: [‘xxxx:9100’] labels: project: app1 … 2. grafana面板套用 21902 模板 演示