JAVA(多线程)day 7.31

news2024/9/23 19:15:09

ok了家人们今天学习多线程,

.多线程相关概念

1.1 并行与并发

并行:在同一时刻,有多个任务在多个 CPU 上同时执行。
并发:在同一时刻,有多个任务在单个 CPU 上交替执行。

1.2  多线程

cpu同时执行多个程序。

好处 : 提高程序的效率。

.多线程创建方式

2.1 创建方式一:继承Thread方式

Thread 是线程类,有两个方法:
public void run() : 线程执行任务的方法,是线程启动后第一个执
行的方法
public void start() : 启动线程的方法, 线程对象调用该方法后,Java虚
拟机就会调用此线程的run方法。
package 多线程Thread;

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName()+"HelloWorld");
        }
    }
}
package 多线程Thread;

public class ThreadTest {
    public static void main(String[] args) {
        MyThread th01 = new MyThread();
        MyThread th02 = new MyThread();

        th01.setName("线程1");
        th01.start();

        th02.setName("线程2");
        th02.start();
    }
}

2.2 创建方式二:实现Runable接口方式

第二种创建方式使用接口Runnable,重写接口Runnable ,run方法
创建任务对象
使用含有 Runnable 参数的构造方法,创建线程对象并指定任
务。
调用线程的 start 方法,开启线程。
public class Mydesk implements Runnable {
    @Override
    public void run() {
        
        for (int i = 0; i < 100; i++) {
            System.out.println("线程1-" + i);
        }
    }
}
public class DeskTest {
    public static void main(String[] args) {
        Mydesk md = new Mydesk();

        Thread th = new Thread(md);

        th.start();

        for (int i = 0; i < 200; i++) {
            System.out.println("线程2-"+i);
        }
    }
}

2.3 创建方式三:实现多线程的优先级

获取类的优先级和指定优先级

方法

package 多线程线程的优先级setPriority;

public class ThreadTest {
    public static void main(String[] args) {
        MyThread mt = new MyThread();

        Thread td = new Thread(mt,"飞机");//优先级为5
        Thread td01 = new Thread(mt,"tank");//优先级为1-10

        System.out.println(td.getPriority());
        System.out.println(td01.getPriority());

        td.setPriority(10);
        td01.setPriority(1);

        td.start();
        td01.start();
    }
}

.Thread类常用方法

获取线程的名字:String getName()
设置线程的名字:void setName(String name);通过构造方法
也可以设置线程名称
获得当前线程的对象:public static Thread currentThread() 
让线程休眠指定的时间,单位为毫秒:public static void
sleep(long time)
public class Mydesk implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + i);//获取名字
        }
    }
}
public class dm02 {
    public static void main(String[] args) throws InterruptedException {
        Mydesk md = new Mydesk();

        Thread th = new Thread(md,"线程1");//设置名字

        th.start();
        //Thread.sleep(1000);

        for (int i = 0; i < 200; i++) {
            System.out.println("线程2-"+i);
        }
    }
}

.线程安全问题

4.1 线程安全问题演示

package 综合案例_多线程SellTicket;

public class Selldesk implements Runnable {
    private int ticket = 100;

    @Override
    public void run() {
        while (true) {
            if (ticket <= 0) {
                break;
            }
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "正在卖" + ticket + "号票");
                ticket--;
            }
        }
    }
}
package 综合案例_多线程SellTicket;

public class SellTest {
    public static void main(String[] args) {
        Selldesk sk = new Selldesk();

        Thread th = new Thread(sk,"窗口一-");
        Thread th02 = new Thread(sk,"窗口二-");
        Thread th03 = new Thread(sk,"窗口三-");

        th.start();
        th02.start();
        th03.start();
    }
}
卖票出现了问题
问题原因:多个线程在对共享数据进行读改写的时候,可能导致的
数据错乱就是线程的安全问题了

4.2 卖票案例数据安全问题的解决

基本思想:让共享数据存在安全的环境中 , 当某一个线程访问共享数
据时 其他线程是无法操作的
把多条线程操作共享数据的代码给锁起来,让任意时刻只能有一个
线程执行即可。 Java 提供了同步代码块的方式来解决。
4.2.1 同步代码块
默认情况锁是打开的,只要有一个线程进去执行代码了,锁就会
关闭
当线程执行完出来了,锁才会自动打开
锁对象可以是任意对象 , 但是多个线程必须使用同一把锁
synchronized(任意对象) { 
      多条语句操作共享数据的代码
}
同步的好处和弊端
好处:解决了多线程的数据安全问题
弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这
是很耗费资源的,无形中会降低程序的运行效率
package 综合案例_多线程SellTicket;

public class Selldesk implements Runnable {
    private int ticket = 100;
    Object obj = new Object();
    @Override
    public void run() {
        while (true) {
            if (ticket <= 0) {
                break;
            }
            synchronized (obj) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在卖" + ticket + "号票");
                    ticket--;
                }
            }
        }
    }
}

4.2.2 同步方法

同步方法:就是把 synchronized 关键字加到方法上 , 保证线程执行该
   
修饰符 synchronized 返回值类型 方法名 ( 方法参数 ) {   } 同步代码块可以锁住指定代码 , 同步方法是锁住方法中所有代码
同步代码块可以指定锁对象 , 同步方法不能指定锁对象
注意 : 同步方法时不能指定锁对象的 , 但是有默认存在的锁对象的。
对于非 static 方法 , 同步锁就是 this
对于 static 方法 , 我们使用当前方法所在类的字节码对象 (
.class) Class 类型的对象
package 综合案例_多线程SellTicket;

public class Selldesk implements Runnable {
    private int ticket = 100;
    Object obj = new Object();
    @Override
    public void run() {
        while (true) {
            if (ticket <= 0) {
                break;
            }
              method();
            }
        }
        public synchronized void method(){
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "正在卖" + ticket + "号票");
                ticket--;
            }
        }
    }

4.2.3 Lock锁机制

虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们
并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的
表达如何加锁和释放锁, JDK5 以后提供了一个新的锁对象 Lock
Lock 中提供了获得锁和释放锁的方法
void lock():获得锁
void unlock():释放锁
Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock
来实例化
ReentrantLock的构造方法ReentrantLock():创建一个
ReentrantLock的实例

注意:多个线程使用相同的 Lock 锁对象,需要多线程操作数据的代
码放在 lock() unLock() 方法之间。一定要确保 unlock 最后能够调用

package 综合案例_多线程SellTicket;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Selldesk implements Runnable {
    private int ticket = 100;
    Object obj = new Object();
    Lock l = new ReentrantLock();
    @Override
    public void run() {
        while (true) {
            if (ticket <= 0) {
                break;
            }
            l.lock();

            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "正在卖" + ticket + "号票");
                ticket--;
                }
            l.unlock();
            }
        }
    }

ok了家人们,多线程搞完了。

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

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

相关文章

Mix、Lab是一种生活状态#Mixlab夏日T恤

shadow&#xff1a;这款怎么样&#xff1f; 混合实验家 千*然 15:53&#xff1a; " 夸夸&#xff0c;帅爆 logo很有细胞活力啊&#xff01; 再开个白款&#xff0c;夏天凉快&#xff01;大T&#xff0c;冲&#xff01; ” shadow: 往常都是孵化社区成员的项目&#xff0c…

非线性面板数据实证模型及 Stata 具体操作步骤

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 一、引言 在当今的经济和社会研究中&#xff0c;非线性面板数据模型的应用日益广泛。这类模型能够更好地捕捉数据中的复杂关系&#xff0c;为研究者提供更深入和准确的分析结果。…

json-server(快速搭建本地 RESTful API 的工具)

json-server 是什么? Json-server 是一个零代码快速搭建本地 RESTful API 的工具。它使用 JSON 文件作为数据源,并提供了一组简单的路由和端点,可以模拟后端服务器的行为。 github地址:GitHub - typicode/json-server: Get a full fake REST API with zero coding in less…

VS code-解决云服务器重装镜像后vs code无法连接的问题

问题描述&#xff1a;从centos换到ubantu后&#xff0c;xshell能直接连接上&#xff08;没有更改ssh配置信息&#xff09;&#xff0c;但是vscode连不上&#xff08;配置文件因为端口号和ip是一样的&#xff0c;也没法改&#xff09; 解决办法&#xff1a; 找到vs code config…

从DevOps到DevSecOps是怎样之中转变?

DevSecOps是DevOps实践的自然演进&#xff0c;其重点是将安全集成到软件开发和部署流程中。在DevOps和DevSecOps发展之前&#xff0c;企业通常在在软件部署前进行集中的安全测试&#xff0c;导致安全介入严重滞后&#xff0c;漏洞分风险无法及时修复&#xff0c;影响上线交付。…

MGTR-250M 以电折水设备-助力取水计量监测体系建设

一体式以电折水智能终端通过高度集成化设计&#xff0c;巧妙融合了空气开关、开关电源、隔离变压器、接触器、智能电表、RTU、4G通信模块、定位模块等八大核心功能&#xff0c;不仅展现了经济高效和智能运维的双重优势&#xff0c;更以其超强的安全防护能力确保了使用的高度安全…

CV相关知识

在计算机科学和人工智能领域&#xff0c;"CV" 通常指的是 "Computer Vision"&#xff08;计算机视觉&#xff09;。计算机视觉是研究如何使计算机能够从图像或视频中获取、处理和理解视觉信息的科学和技术。计算机视觉的目标是使计算机能够自动执行人类视觉…

干净清爽的网页给用户浏览体验的重要性!此刻便展现了出来

干净清爽的网页给用户浏览体验的重要性 艾斯视觉作为ui设计和前端开发从业者&#xff0c;其观点始终认为&#xff1a;网页已成为信息传播和交流的重要平台。一个干净清爽的网页设计不仅能够吸引用户的眼球&#xff0c;更能提升用户的浏览体验&#xff0c;从而在激烈的网络竞争…

完整模型训练套路 试写 以CIFAR10分类数据集为例

思路步骤&#xff1a; 第一步准备数据集&#xff1a;&#xff08;训练集&#xff0c;测试集&#xff09; import torchvisionTrain_dataset torchvision.datasets.CIFAR10("./data",True,transformtorchvision.transforms.ToTensor()) Test_Dataset torchvision…

小程序记账系统2024

小程序记账系统2024,编号weixin002 下载在最后 技术栈: 前台:js 后台:java 展示: 下载地址: CSDN现在上传有问题,有兴趣的朋友先收藏.正常了贴上下载地址 备注:

十二星座男、被戴绿帽后有啥反应 。

白羊座——火爆型 金牛座——沉默型 双子座——智慧型 巨蟹座——自毁型 狮子座——暴力型 处女座——喊包型 天秤座——潇洒型 天蝎座——有仇必报型 射手座——气过就算型 摩羯座——冷傲型 双鱼座——大方伟大型 水瓶座——飘忽型

Shell脚本的进程管理

进程管理是系统管理的重要方面&#xff0c;通过对进程的监控、启动、停止和重启&#xff0c;可以保证系统的稳定运行。Shell脚本是一种强大的工具&#xff0c;可以对进程进行自动化管理&#xff0c;提高效率和准确性。 参考&#xff1a;shell脚本进程管理 - CSDN文库 shell脚本…

JavaScript(四)——JavaScript 语法

目录 JavaScript 语法 JavaScript 字面量 JavaScript 变量 JavaScript 操作符 JavaScript 语句 JavaScript 关键字 JavaScript 注释 JavaScript 数据类型 JavaScript 函数 JavaScript 字母大小写 JavaScript 字符集 驼峰命名法 小驼峰命名法 大驼峰命名法&#xf…

DrissionPage,一个超实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超实用的 Python 库 - DrissionPage。 Github地址&#xff1a;https://github.com/g1879/DrissionPage 在网页数据抓取和自动化测试中&#xff0c;Selenium 和 Requests 是…

LeetCode-35 - 在排序数组中查找元素的第一个和最后一个位置

力扣35题 题目描述&#xff1a;在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必…

N-way K-shot Few shot learning

首先需要明确的是少样本领域的数据划分和大规模监督学习方法的数据划分不一样。在大规模监督学习方法中&#xff0c;训练集和测试集是混合后按比例随机切分&#xff0c;训练集和测试集的数据分布一致。以分类问题为例&#xff0c;切分后训练集中的类别和测试集中的类别相同&…

二进制部署k8s单master集群

一、常见的K8S部署方式 1、Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特性使用。 https://kubernetes.io/docs/setup/minikube 2、Kubeadmin Kubeadmin也是一个工具&#xff0c;提供kubeadm init…

大模型之技术概述

本文作为大模型综述第一篇&#xff0c;介绍大模型技术基本情况。 目录&#xff1a; 1.大模型技术的发展历程 2.大模型技术的生态发展 3.大模型技术的风险与挑战 1.大模型技术的发展历程 2006 年 Geoffrey Hinton 提出通过逐层无监督预训练的方式来缓解由于梯度消失而导致的…

HTML连接样式CSS和表格,表单

HTML连接样式CSS <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <-设置背景都是红色-> <body style"background-color:red;"> <-设置…

从赛场到云端:视频监控技术与赛事直播的技术融合与革新

在当今信息化高速发展的时代&#xff0c;视频监控技术和赛事直播作为两个重要的应用领域&#xff0c;正在以前所未有的速度融合&#xff0c;共同推动着传媒与安防领域的进步。本文将探讨视频监控技术在赛事直播中的应用及其带来的革新。 一、视频监控技术的演进 视频监控技术…