JAVA学习笔记30(线程)

1.线程

1.线程的概念

1.线程是由进程创建的,是进程的一个实体

2.一个进程可以拥有多个线程

2.并发

​ *同一时刻,多个任务交替执行,造成一种"貌似同时"的错觉,单核cpu实现的多任务就是并发

3.并行

​ *同一时刻,多个任务同时执行,多核cpu可以实现并行

4.继承线程的两种方式

1.继承Thread类,重写run方法

public class Tread01 {
    main() {//主线程
        //创建Cat对象,可以当做线程使用
        Cat cat = new Cat();
        cat.run();//直接调用就是在main线程里面执行,执行完run方法才会继续向下执行
        cat.start();//启动子线程
    }
}

//当一个类继承了Thread类,该类就可以当成线程使用
class Cat extends Thread {
    @Override
    public void run() {//重写run方法,写上业务逻辑
        while(true) {
        		//该线程每隔1秒,控制台输出"喵喵,我是小猫咪"
        System.out.println("喵喵,我是小猫咪");
        try{
              Thread.sleep(1000);//休眠1秒  
        }catch(InterruptedException e) {
			e.printStackTrace();	
        }
        }
    }
}

2.实现Runnable接口,重写run方法

​ 1.java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时就不能通过继承Thread类方法来创建线程了

​ 2.提供了另外一个方式创建线程,实现Runnable接口来创建线程

public class Tread01 {
    main() {//主线程
        //创建Cat对象,可以当做线程使用
        Cat cat = new Cat();
        cat.run();//直接调用就是在main线程里面执行,执行完run方法才会继续向下执行
        //创建了Thread对象,把cat对象(实现了Runnable)放入Thread
        Thread thread = new Thread(cat);
        thread.start();
    }
}

//当一个类继承了Runnable接口,该类就可以当成线程使用
class Cat implements Runnable {
    @Override
    public void run() {//重写run方法,写上业务逻辑
        while(true) {
        		//该线程每隔1秒,控制台输出"喵喵,我是小猫咪"
        System.out.println("喵喵,我是小猫咪");
        try{
              Thread.sleep(1000);//休眠1秒  
        }catch(InterruptedException e) {
			e.printStackTrace();	
        }
        }
    }
}

5.线程终止

1.线程完成后,自动退出

2.还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式

6.线程常用方法

1.setName

//设置线程名称,使之与参数name相同

2.getName

//返回该线程名称

3.start

//使该线程开始执行,Java虚拟机底层调用该线程的start0方法

4.run

//调用线程对象run方法

5.setPriority

//更改线程的优先级

在这里插入图片描述

6.getPriority

//获取线程的优先级

7.sleep

//在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

8.interrupt

//中断线程 一般用来中断线程休眠,让它继续运行

class T extends Thread {
    @Override
    public void run() {
        while(true) {
            for(int i =0;i<100;i++) {
                System.out.println(Thread.currentThread().getName())
            } try {
                System.out.println(Thread.currentThread().getNmae() + "休眠中");
                Thread.sleep(2000);//20秒
            }
        }
    }
}

main() {
    T t = new T();
    t.setNmae("qweq");
    t.setPriority(Thread.MIN_PRIORITY);
    t.start();
    
    for(int i=0;i<5;i++) {
        Thread.sleep(1000);
        System.out.println("hi"+i);
    }
    t.interrupt();//执行到这里时,就会中断t的休眠
}

9.yield

//让出cpu,让其他的线程执行,但礼让的时间不确定,所以也不一定礼让成功

//自身调用Thred.yield

10.join

//线程的插队,插队的线程一旦插队成功,则肯定先执行完插入的线程的所有任务

//别的调用t2.join

7.用户线程和守护线程

1.用户线程:也叫工作线程,当线程的任务执行完或通知方式结束

2.守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束

3.常见的守护线程:垃圾回收机制

main() {
    MyDaemonThread myDaemonThread = new MyDaemonThread();
    //将子线程设为守护线程
    myDaemonThread.setDaemon(true);
    myDaemonThread.start();
}

8.线程7大状态

在这里插入图片描述
在这里插入图片描述

9.线程同步机制

1.在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性

2.线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,知道该线程完成操作

10.同步具体方法-Synchronized

1.同步代码块

synchronized (对象) {	//得到对象的锁,才能操作同步代码
    //需要被同步代码;
    
}

2.synchronized还可以放在方法声明中,表示整个方法-为同步方法

public synchronized void m (String name) {//需要被同步的代码

}

11.互斥锁

1.保证共享数据操作的完整性

2.每个对象都对应于一个可称为"互斥锁"的标记,这个标记用来保证在任意时刻,只能有一个线程访问该对象

3.关键字synchronized来与对象的互斥联系,当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问

4.同步局限性:导致程序的执行效率降低

5.同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)

public void sell() {
	synchronized (this//或者 Object) {
        //执行代码
    }
}

public synchronized void sell() {
    //执行代码
}

6.同步方法(静态的)的锁为当前类本身

class SellTicket03 implements Runnable {
	public synchronized static void m1() {
		
    }
    
	public static void m2() {
		synchronized (SellTicket03.class) {
            System.out.println("m2");
        }
    }
}

1.注意事项和细节

1.同步方法如果没有使用static修饰,默认锁对象为this

2.如果方法使用static修饰,默认锁对象:当前类.class

12.线程的死锁

​ *多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程需要避免

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

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

相关文章

电商平台业务及架构演变史

不少人认为电商系统很简单&#xff0c;因为现在做电商的太多了&#xff0c;看到的电商产品也多。看来看去产品都差不多&#xff0c;没什么特别。 其实中国电商发展已有20多年历史&#xff0c;电商以销售为核心连接着研、产、供、销、服整套的信息系统体系。其中的设计并没有那…

Mongodb支持事务吗?

一、概念 1.1、MongoDB事务简介 MongoDB 是一个非关系型数据库管理系统&#xff0c;最初并不支持事务。然而&#xff0c;随着时间的推移&#xff0c;MongoDB 在其4.0版本中引入了多文档事务支持&#xff0c;使得在单个集合中执行多个操作成为可能。 In MongoDB, an operation…

【MySQL探索之旅】多表查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

CCF PTA 2023年5月C++富有的大壮

【问题描述】 给在一个神秘的国度&#xff0c;有一种多拿多得的疯狂游戏&#xff0c;某日大壮去参赛&#xff0c;在规定区域内里面有 N(N≤100) 堆金币&#xff0c;第i堆金币的总重量和总价值分别是mi,vi(1≤ mi,vi≤100)。大壮有一个承重量为T(T≤1000) 的背包&#xff0c;但…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本&#xff0c;此表列出了仍支持哪些 Xdebug 版本&#xff0c;以及哪些版本可用…

vue框架中的组件通信

vue框架中的组件通信 一.组件通信关系二.父子通信1.props 校验2.prop & data、单向数据流 二.非父子通信-event bus 事件总线三.非父子通信 (拓展) - provide & inject四.v-model简化父子通信代码五. .sync修饰符 一.组件通信关系 组件关系分类&#xff1a; 1.父子关系…

2024接口自动化测试高频面试题【建议收藏】

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b;以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格式…

文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

本章将介绍Linux应用编程中最基础的知识&#xff0c;即文件I/O&#xff08;Input/Output&#xff09;。文件I/O指的是对文件进行读写操作&#xff0c;在Linux系统中一切皆文件&#xff0c;这是Linux系统设计的核心理念&#xff0c;因此文件I/O操作既是基础又是最重要的部分。本…

【webrtc】m114自己实现的PrioritizedPacketQueue及优先级处理

G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\pacing\prioritized_packet_queue.h跟m98不同 :webrtc】m98 RoundRobinPacketQueue的优先级处理,m114直接使用taskqueue顺序处理了。甚至自己实现了优先级队列感觉简化了实现,更为清晰 易读,但是去掉了码率低就优先的逻辑。1…

浮杯式轴向柱塞泵(浮杯泵)应用前景较好 但目前产业化规模小

浮杯式轴向柱塞泵&#xff08;浮杯泵&#xff09;应用前景较好 但目前产业化规模小 浮杯式轴向柱塞泵简称浮杯泵&#xff0c;是利用缸体与柱塞间的相对运动改变腔体容积完成吸排油的一类柱塞泵。浮杯泵是基于浮杯原理开发出来的&#xff0c;浮杯原理是继斜盘式和斜轴式之后一种…

Java反序列化-CC4-2-5-7链分析

环境搭建 在之前环境原有代码的基础上&#xff0c;添加这一段代码 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version></dependency>CC4链分析 CC4可…

C语言 | Leetcode C语言题解之第44题通配符匹配

题目&#xff1a; 题解&#xff1a; bool allStars(char* str, int left, int right) {for (int i left; i < right; i) {if (str[i] ! *) {return false;}}return true; } bool charMatch(char u, char v) { return u v || v ?; };bool isMatch(char* s, char* p) {in…

【探索Linux】P.32(自定义协议)

阅读导航 引言一、自定义协议概念二、自定义协议需要注意的事项三、自定义协议示例(跨网络计算器协议)✅协议代码&#xff08;Protocol.hpp&#xff09;1. 计算器协议简单介绍2. 序列化部分3. 反序列化部分4. 请求和响应数据结构5. 使用自定义协议 四、总结温馨提示 引言 在上…

iOS - 多线程-GCD

文章目录 iOS - 多线程-GCD1. 常见多线程方案2. GCD2.1 GCD的常见函数GCD中有2个用来执行任务的函数 2.2 GCD的队列2.2.1 GCD的队列可以分为2大类型 2.3 容易混淆的术语2.4.1 有4个术语比较容易混淆&#xff1a;同步、异步、并发、串行 2.4 各种队列的执行效果 3. 死锁3.1 死锁…

了解BACnet的对象模型 (三)

文章目录 前言18个对象BACnet 对象的属性设备对象&#xff08;Device&#xff09;的属性输入输出值对象类型及其属性 在代码中的表达Device对象的属性模拟输入对象的属性 小结 前言 在楼宇自控网络中&#xff0c;各种设备之间要进行数据交换&#xff0c;为了能够实现设备的互操…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(四)、设计实现

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…

【Yolov系列】Yolov5学习(一)补充1.1:自适应锚框计算

1、Yolov5的网络结构 Yolov5中使用的Coco数据集输入图片的尺寸为640*640&#xff0c;但是训练过程的输入尺寸并不唯一&#xff0c;Yolov5可以采用Mosaic增强技术把4张图片的部分组成了一张尺寸一定的输入图片。如果需要使用预训练权重&#xff0c;最好将输入图片尺寸调整到与作…

表达式求值(后缀表达式)(数据结构)

一、概念 算术表达式是由操作数&#xff08;运算数&#xff09;、运算符&#xff08;操作符&#xff09;、和界线符&#xff08;括号&#xff09;三部分组成&#xff0c;在计算机中进行算术表达式的计算是通过堆栈来实现的。 二后缀表达式的逻辑和实现方式&#xff08;逆波兰…

CST电磁仿真软件波导端口和离散端口的设置流程【教程解读】

置波导端口 通过波导端口馈电! Simulation > Sources and Loads > Waveguide Port 假设Waveguide Port是无限长的波导上给定的Mode&#xff0c;用来激励电磁场。相比离散端口(Discrete Port)&#xff0c;波导端口可以提供很好的模式匹配&#xff0c;因此能提供更高的精…

Android Material Design学习笔记

Material Design控件学习记录 Toolbar 新建一个工程后&#xff0c;在res/values/themes.xml文件里 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Theme.MaterialTest" paren…