【笔记:Java线程/常用方法】

Java多线程超详细笔记 System.out.println(Thread.currentThread().getName()+“正在出售第”+(tickets–)+“张票”);System.out.println(Thread.currentThread().getName()+“正在出售第”+(tickets–)+“张票”);System.out.println(Thread.currentThread().getName()+“正在出售第”+(tickets–)+“张票”);所谓代码块就是使用{}括起来的一段代码; 阅读详情

线程常用方法

  • setName //设置线程名称

  • getName //返回该线程名称

  • start //使该线程开始执行;Java虚拟机调用该线程的start0方法

  • run //调用线程对象run方法

  • setPriority //更改现成的优先级

  • getPriority //获取线程的优先级

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

  • interrput //中断线程

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

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

public class SellTicket {

    public static void main(String[] args) throws InterruptedException {

        SellTicket01 sellTicket01 = new SellTicket01();

        Thread thread1 = new Thread(sellTicket01);
        //设置线程名称
        thread1.setName("一号");
        //更改线程优先级1:Thread.MAX_PRIORITY   5:Thread.NORM_PRIORITY     10:Thread.MAX_PRIORITY
        thread1.setPriority(1);
        //获取线程优先级
        int a = thread1.getPriority();
        System.out.println(a);
        //获取线程名称
        String name = thread1.getName();
        System.out.println(name);
        //开始执行线程
        thread1.start();
        //休眠1000毫秒
        Thread.sleep(1000);
        //线程礼让
        Thread.yield();
        //线程的插队
        thread1.join();
        new Thread(sellTicket01).start();
        new Thread(sellTicket01).start();
    }

}

class SellTicket01 implements Runnable{
    private static int ticketNum = 100;
    @Override
    public void run() {
        while (true){
            if(ticketNum <=0){
                System.out.println("售票结束");
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("窗口" + Thread.currentThread().getName() + "售出一张票,剩余票数:"+(--ticketNum));
        }
    }
}

用户线程与守护线程Daemon

  • 用户线程:也叫工作线程,当线程的任务完成或通知方式结束
  • 守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束
  • 常见的守护线程:垃圾回收机制
public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        MyDaemonThread myDaemonThread = new MyDaemonThread();
        //设为保护线程(main线程结束之后,子线程自动结束)
        myDaemonThread.setDaemon(true);
        myDaemonThread.start();
        for (int i = 0; i < 5; i++) {
            System.out.println("吃包子" + i);
            Thread.sleep(1000);
        }
    }
}
class MyDaemonThread extends Thread{
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("嘿嘿嘿");
        }
    }
}
/*
    吃包子0
    吃包子1
    嘿嘿嘿
    吃包子2
    吃包子3
    嘿嘿嘿
    吃包子4
 */

线程的状态

image.png
image.png
image.png

public class State {
    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        System.out.println(t.getName()+"状态"+t.getState());
        t.start();

        while (Thread.State.TERMINATED != t.getState()){
            System.out.println(t.getName()+"状态"+t.getState());

            Thread.sleep(1000);
        }

        System.out.println(t.getName()+"状态"+t.getState());
        /*
            Thread-0状态NEW
            Thread-0状态RUNNABLE
            hi0
            Thread-0状态TIMED_WAITING
            hi1
            Thread-0状态TIMED_WAITING
            hi2
            Thread-0状态TIMED_WAITING
            Thread-0状态TERMINATED
         */
    }
}
class T extends Thread{
    @Override
    public void run() {
        while (true){
            for (int i = 0; i < 3; i++) {
                System.out.println("hi"+i);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            break;
        }
    }
}

线程同步机制

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

同步具体方法:Synchronized

  • 同步代码块
synchronized(对象){	//得到对象的锁才能同步代码
	//需要被同步代码
}
  • synchronized还可以放在方发声明中,表示整个方法为同步方法
public synchronized viod m(String name){
	//需要同步的代码
}

示例:

public class Synchronized_ {
    public static void main(String[] args) {
        SellTicket01 sellTicket01 = new SellTicket01();
        new Thread(sellTicket01).start();
        new Thread(sellTicket01).start();
        new Thread(sellTicket01).start();
    }
}
//实现接口方式,使用是synchronized实现线程同步
class SellTicket01 implements Runnable{

    private static int ticketNum = 10;
    private boolean loop = true;

    public synchronized void sell() {   //同步方法,在同一时刻只能有一个线程来执行sell方法
        if(ticketNum <=0){
            System.out.println("售票结束");
            loop = false;
            return;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口" + Thread.currentThread().getName() + "售出一张票,剩余票数:"+(--ticketNum));
    }
    @Override
    public void run() {
        while (loop){
            sell(); //sell方法是同步方法
        }
    }
}
/*
    窗口Thread-0售出一张票,剩余票数:9
    窗口Thread-0售出一张票,剩余票数:8
    窗口Thread-1售出一张票,剩余票数:7
    窗口Thread-1售出一张票,剩余票数:6
    窗口Thread-2售出一张票,剩余票数:5
    窗口Thread-2售出一张票,剩余票数:4
    窗口Thread-1售出一张票,剩余票数:3
    窗口Thread-0售出一张票,剩余票数:2
    窗口Thread-1售出一张票,剩余票数:1
    窗口Thread-2售出一张票,剩余票数:0
    售票结束
    售票结束
    售票结束
 */

互斥锁

  • Java语言中,引入了互斥锁概念,来保证共享数据操作的完整性
  • 每个对象都对应一个可称为“互斥锁”的标记,这个标记用来保证在任意时刻,只能有一个线程访问该对象
  • 关键字synchronized来与对象的互斥锁联系,当某个对象用synchronized修饰时,表明该对象在任一时刻只能有一个线程访问
  • 同步的局限性:导致程序的执行效率降低
  • 同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)
  • 同步方法(静态的)的锁为当前类本身

注意:

1. 同步方法如果没有使用static修饰,默认锁对象为this
2. 如果方法使用static修饰,默认锁对象:当前类.class

线程的死锁、释放

死锁:多个线程都占用了对方的锁资源,但不肯相让,导致了死锁。在编程中一定要避免死锁的发生

下面的操作会释放锁:

  • 当前线程的同步方法、同步代码块执行结束
  • 当前线程在同步代码块、同步方法中遇到break、return
  • 当前线程在同步代码快、同步方法中出现了未处理的Error或Exception,导致异常结束
  • 当前线程在同步代码快、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁

下面的操作不会释放锁:

  • 线程执行同步代码块或同步方法时,程序调用了Thread.sleep(), Thread.yield()方法暂停了当前线程的执行,不会释放锁

  • 线程执行同步代码块时,其他线程调用了该线程的suspend()将该线程挂起,该线程不对释放锁

    注意:应尽量避免使用suspend()和 resume()来控制线程,不推荐使用

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图) 本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。 阅读详情

相关推荐

企业IT运维实录:批量部署银河麒麟V10-SP1,Ghost镜像与UKey激活实战

本文详细介绍了企业级银河麒麟V10-SP1操作系统的批量部署全流程,包括标准化镜像制作、自动化封装技术、网络化部署方案及UKey集群激活方案。通过实战案例和技术要点解析,帮助企业IT运维团队大幅提升部署效率,确保系统安全与稳定性。

weixin_30729609的博客 388

Requests库常用方法及其详解

request库七个方法详解 1. request方法 所有方法的的基础方法,三个参数:method,url,**kwargs。 1.1 method:请求方式 method参数共有七个可选的值,分别对应HTTP协议的七种操作: 对应的方法可以用request方法直接实现,也可以用封装好的request.get()等方法实现。 1.2 访问控制参数(可选) 1.params:字典或者...

weixin_30706691的博客 532

头歌工程实训答案-机器学习篇之手写体识别篇

第2关:激活函数'''x:负无穷到正无穷的实数'''if x<=0:return 0else:return x#***第3关:反向传播算法import os。

m0_71537260的博客 2520

pyspark常用类和方法总结:Session、DataFrame、DataFrameReader、DataFrameWriter

总结来自pyspark的官方文档:http://spark.apache.org/docs/latest/api/python/index.html pyspark中一共有以下几个包和子包: pyspark pyspark.sql pyspark.streaming pyspark.ml pyspark.mllib 类名 功能 pyspark.sql.SparkSession M...

爱乂乂的博客 3978

智能汽车竞赛摄像头处理(4)——摄像头循迹思路讲解

智能汽车竞赛摄像头处理(4)对摄像头循迹思路进行讲解。

weixin_62261692的博客 7061

深入探讨 VQ-VAE:理解变分量化自动编码器

VQ-VAE代表"Variational Quantized Variational Autoencoder",是一种生成模型,通常用于处理高维数据,如图像和音频。它的设计灵感来自于变分自动编码器(VAE)和量化方法,结合了它们的优点,使得 VQ-VAE 能够生成高质量的数据,并在数据表示上引入离散性。VQ-VAE 是一种强大的生成模型,结合了变分自动编码器和量化方法的优点。它在图像和音频生成、数据压缩和生成性对抗网络等领域具有广泛的应用。

DeepViewInsight的博客 7016

Java——》线程常用的方法

● start :启动线程 ● run :运行线程 ● currentThread :获取当前线程对象 ● getName :获取线程名称 ● sleep :将当前线程暂定指定的时间 ● isAlive :获取线程的状态 ● join :将当前线程和该线程合并,即等待该线程结束,在恢复当前线程的运行 ● yield :让出CPU,当前线程进入就绪状态 ● wait :阻塞,是Object中的方法 ● notify :唤醒,是Object中的方法 ● notifyAll :唤醒

小仙~ 1738

HDMI协议介绍(二)--DataIsland Packets

前文简单介绍了HDMI传输的三个周期:控制周期、DataIsland周期和Video周期。DataIsland传输音频和辅助数据,这些数据以Packet的形式传输。本文简单介绍DataIsland Packet。

SlamDunk的博客 5676

Java多线程常用方法

start()与run() start() 启动线程并执行相应的run()方法 run() 子线程要执行的代码放入run()方法 getName()和setName() getName() 获取此线程的名字 setName() 设置此线程的名字 isAlive() 是判断当前线程是否处于活动状态。活动状态就是已经启动尚未终止。 currentThread()...

少说,多做。 7759

使用 Python 爬虫获取中国证券市场公司公告数据

本文详细介绍了如何使用 Python 爬虫技术从中国证券市场(如巨潮资讯网)爬取公司公告数据。通过分析网页结构,编写爬虫脚本,抓取并存储公告信息,我们实现了从网页抓取数据的全过程。此外,本文还展示了如何应对反爬虫机制,并介绍了数据分析与可视化的基本方法。未来,我们可以通过机器学习等技术进一步挖掘公告中的潜在信息,例如,通过情感分析对公告内容进行情绪分类,或者预测某些公告类型对股市走势的影响等。希望本文能帮助你理解如何使用 Python 爬虫技术获取和处理证券市场的数据,并为你的数据分析项目提供帮助。

2201_76125261的博客 1888

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

Java多线程第二篇-线程的常用方法和线程安全

我们可以减少读取的次数,通过sleep睡眠来限定load的读取次数,此时就不会出发内存可见性问题,但是什么时候代码会被JVM优化,我们人是不清楚的,只有机器清除,所以我们尽量使用volatile更保险一些,此方法知道即可。这时候就陷入一种嵌套循环,形成死锁。如果有两把锁设a、b,线程1获取到锁a,然后线程2也获取到锁b,这时候线程1嵌套获取b锁,线程2嵌套获取a锁,则循环等待锁释放,进不去出不来。所谓的可重入锁,指的是一个线程,一把锁,加锁两次,会出现死锁,就是“不可重入“,反之,就是”可重入“。

Freedom的博客 2113

BME688传感器原理图设计,已量产(环境传感器)

在便携式空气质量监测、可穿戴健康设备这类低功耗场景中,BME688 这类集成了 VOC、温湿度、气压的四合一 MEMS 传感器越来越受欢迎 —— 它体积小、功耗低,刚好匹配便携设备的需求。但这类小信号传感器对电源噪声、电平匹配的要求很细,今天结合实际项目里的一款 BME688 接口电路,聊聊硬件设计的关键细节。

不脱发的程序猿 516

JAVA多线程常用方法

介绍了多线程的run,start,sleep,yield,join,interrupt等常用方法

ifhuke的博客 1221

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Java】线程的状态及常用方法

join()方法用于实现线程插队,调用完毕后会释放锁。sleep()方法用于实现线程休眠,调用完毕后不会释放锁。interrupt()方法用于设置该线程的中断状态为 true。yield()方法用于让出 CPU 执行。分时调度模型和抢占式调度模型。

weixin_71491685的博客 2121

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

线程二:线程的类和常用方法

1). 线程对象只有调用了 start() 方法后才会创建出真正的线程。2). 一个线程对象只能调用一次 start() 方法。

m0_73659744的博客 865

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java多线程】多线程的三种实现方式和多线程常用方法

在main()方法中,你可以创建和启动额外的线程,这些线程称为子线程。子线程可以并行执行,与主线程同时进行。多线程的三种实现方式如下: 继承Thread类的方式进行实现 实现Runnable接口的方式进行实现 利用Callable接口和Future接口方式实现

m0_65277261的博客 5094

【Java笔记】第16章:多线程

期待您的一键三连!欢迎指正!

Guiat的博客 1651

java线程状态及线程相关常用方法

中定义),在任意一个时间点中,一个线程只能有且只有其中的一种状态,并 且可以通过特定的方法在不同状态之间转换。这两个超时方法表示,如果线程thread在给定的超时时间里没有终止,那么将会从该超时方法中返回。方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。从上面的断点可以看出,执行了park方法的线程属于WAIT状态。方法的调用时不要求获取锁,调用后,并不会释放持有的锁。有时限的等待, 到 n 毫秒后结束等待,或是被。这两个方法时Object中的方法。

他叫阿来 1104

JAVA线程基础——线程的创建和常用方法

如上代码中的 MyThread 类继承了 Thread 类,并重写了run()方法。在 main 函数里面创建了一个 MyThread 的实例,然后调用该实例的start 方法启动了线程。需要注意的是,当创建完 thread 对象后该线程并没有被启动执行,直到调用了start方法后才真正启动了线程。其实调用 start 方法后线程并没有马上执行而是处于就绪状态,这个就绪状态是指该线程已经获取了除 CPU 资源外的其他资源,等待获取 CPU 资源后才会真正处于运行状态。

weixin_45826852的博客 895

获取Java线程转储的常用方法

1. 线程转储简介 线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。 线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。 Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。 线程调用栈, 也称为方法调用栈。 比如在程序执行过程中, 有一连串的方法调用链: ......

铁锚的优快云博客 2万+

【Java并发】创建和使用线程常用方法总结

线程是操作系统中的基本执行单元(能够直接执行的最小代码块),它是进程中的⼀个实体,是CPU调度和分派的基本单位。本文总结了java中关于线程的一些基本知识点,包括创建和使用线程常用方法。

hrh的博客 1341

线程常用的方法

join()方法是指线程的插队。当前线程暂停执行,直到调用join()方法的线程执行完毕,此外,不影响其它线程的运行。以下就是一个案例当t1线程插队时,就先执行t1,然后再执行主线程,所以输出结果为。

m0_74776907的博客 805

java中的线程及常用方法

2.8 线程 2.8.1 线程的概念 程序:保存在物理介质中的代码片段 进程:正在进行当中的程序,就是操作系统的一个进程 线程:一个程序当中一条独立的执行线索 ​ 作用:只为让在同一时间做多件事,应对多种需求,服务多个客户,而不是单纯考虑提高效率 ​ 实质:宏观并行而围观串行 2.8.2 线程的五大进程(生命周期) 新生(NewBorn) 就绪(Runnable)运行(Running)阻塞(Blocking)消亡(Dead) 2.8.3 实现线程的方式 extends Tr

weixin_46659330的博客 2694

线程调用其他方法java_Java线程常用方法详解

线程的常用方法1.start(): 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。2.run(): Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。3.sleep(int millsec...

weixin_28957683的博客 1071

Java多线程(一):线程的创建方式和常见构造方法以及常用属性

1.3 进程和线程的区别进程是包含线程的,

2401_87254593的博客 1762
上一篇: 【笔记:List接口、Set接口和Map接口】
下一篇: 【笔记:Java IO流】
莱布尼杰
博客等级 码龄9年 3粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值