黑马程序员线程

手把手教你用Kokoro-82M-v1.1-zh搭建本地TTS服务(含WebSocket接口) 本文详细介绍了如何使用Kokoro-82M-v1.1-zh模型搭建本地TTS服务,包括环境配置、模型部署、WebSocket接口实现及性能优化。通过实战指南,开发者可以快速掌握本地部署TTS系统的关键技术,提升语音交互应用的开发效率。 阅读详情

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

黑马程序员线程

Java中如果我们自己没有产生线程,那么系统就会给我们产生一个线程(主线程,main方法就在主线程上运行),我们的程序都是由线程来执行的。进程:执行中的程序(程序是静态的概念,进程动态的概念)。

当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。一个进程可以包含一个或多个线程。如果程序要实现多个代码同时交替运行,就需要产生多个线程。CPU随机的抽出时间,让我们的程序一会做这件事情,一会做另外一件事情,所以线程执行顺序是随机的,不确定的。

线程有四个:

1.       创建状态。当用new操作符创建一个新的线程对象时,该线程处于创建状态。

2.       可运行状态(就绪状态)。执行线程的start()方法为线程分配必需的系统资源,安排其运行,调用线程体run()方法,这样就使得该线程处于可运行状态。

3.       阻塞状态。当发生下列事件时,处于运作状态的线程转入阻塞状态。(1)调用sleep()方法。(2)线程调用wait()方法等待特定条件的满足(3)线程输入/输出阻塞。

4.       消亡状态。当线程的run方法执行结束后,该线程自然消亡。

对于单核CPU来说,某一时刻只能有一个线程在执行(微观串行),从宏观角度来看,多个线程在同时执行(宏观并行)。对于双核或双核以上的CPU来说,可以真正做到微观并行。

Thread类也实现了Runnable接口,因此实现了Runnable接口中的run方法;当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下形式:Thread-number,该number将是自动增加的,并被所有的Thread对象所共享(因为它是static的成员变量)。

线程的实现有两种方式,第一种方式是继承Thread类,然后重写run方法;第二种是实现Runnable接口,然后实现其run方法。将我们希望线程执行的代码放到run方法中,然后通过start方法来启动线程,start方法首先为线程的执行准备好系统资源,然后再去调用run方法。当某个类继承了Thread类之后,该类就叫做一个线程类。一个线程至少要包含一个线程。

当使用第一种方式来生成线程对象时,我们需要重写run方法,因为Thread类的run方法此时什么事情也不做。当使用第二种方式来生成线程对象时,我们需要实现Runnable接口的run方法,然后使用new Thread(new MyThread())(假如MyThread已经实现了Runnable接口)来生成线程对象,这时的线程对象的run方法就会调用MyThread类的run方法,这样我们自己编写的run方法就执行了。

关于成员变量与局部变量:如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程)。

如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程。

停止线程的方式:不能使用Thread类的stop方法来终止线程的执行。一般要设定一个变量,在run方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出循环,线程接受。

可以通过setPriority(int num)来设置线程的优先级。

synchronized关键字:当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。

Java中的每个对象都有一个锁或者叫做监视器,当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。

如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。

如果某个synchronized方法时static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。

Synchronized块,写法:

Synchronized(object)

{

}

表示线程在执行的时候会对object对象上锁。

Synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的代码是可以被多个线程同时访问到的。

wait与notify方法都是定义在Object类中,而且是final的,因此会被所有的java类所继承并且无法重写。这两个方法要求在调用时线程应该已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或块当中。当线程执行了wait方法时,它会释放掉对象的锁。

线程间通信:等待/唤醒机制,也就是常见的生产者消费者问题。需要注意的是:

1.当多个生产者消费者出现时,需要让获取执行权的线程判断标记。通过while完成。

2.需要将对方的线程唤醒。仅仅用notify,是不可以的。因为有可能出现只唤醒本方。有可能会导致,所有线程都等待。所以可以通过notifyAll的形式来完成 。

另一个会导致线程暂停的方法是Thread类的sleep方法,它会导致线程睡眠指定的毫秒数,但线程在睡眠的一个过程中是不会释放掉对象的锁的。Wait()方法会释放锁。

线程组:所有线程都属于一个线程组。那可以是一个默认线程组,也可以是一个创建线程时明确指定的组。说明:在创建之初,线程被限制在一个组里,而且不能改变到一个不同的组。若创建多个线程而不指定一个组,它们就会与创建它的线程属于同一个组。

Timer和TimerTask提供了提前安排将来某时间要执行任务的能力。使用这些类可以创建一个工作于后台的线程,该线程等待一段指定的时间。当指定的时间到来时,与该线程相连的任务被执行。不同的选项允许安排一个任务重复执行,或安排一个任务在指定的时间运行。Timer和TimerTask一起工作。Timer是一个用于安排一个将来执行的任务的类。被安排的任务必须是TimerTask的一个实例。因此,为了安排一个任务,首先应该创建一个TimerTask对象,然后使用Timer的一个实例安排执行它。

实例代码如下

package com.itheima;

publicclass ThreadTest1

{

    publicstaticvoid main(String[] args)

    {

       Thread1 t1 = new Thread1("first thread");

       Thread1 t2 = new Thread1("second thread");

      

       System.out.println(t1.getName());

       System.out.println(t2.getName());

      

       t1.start();

       t2.start();

    }

}

 

class Thread1 extends Thread

{

    public Thread1(String name)

    {

       super(name);

    }

   

    @Override

    publicvoid run()

    {

       for(int i = 0; i < 100; i++)

       {

           System.out.println("hello world: " + i);

       }

    }

}

 

class Thread2 extends Thread

{

    public Thread2(String name)

    {

       super(name);

    }

   

    @Override

    publicvoid run()

    {

       for(int i = 0; i < 100; i++)

       {

           System.out.println("welcome: " + i);

       }

    }

}

 

 

package com.itheima;

publicclass ThreadTest2

{

    publicstaticvoid main(String[] args)

    {

       Runnable r = new HelloThread();

      

       Thread t1 = new Thread(r);

      

       //r = new HelloThread();

      

       Thread t2 = new Thread(r);

      

       t1.start();

       t2.start();

    }

}

 

class HelloThread implements Runnable

{

    inti;

    @Override

    publicvoid run()

    {

       int i = 0;

      

       while(true)

       {

           System.out.println("number: " + this.i++);

          

           try

           {

              Thread.sleep((long)(Math.random() * 1000));

           }

           catch (InterruptedException e)

           {

              e.printStackTrace();

           }

          

           if(50 == this.i)

           {

              break;

           }

       }

    }

}

 

 

package com.itheima;

publicclass ThreadTest3

{

    publicstaticvoid main(String[] args)

    {

       Example example = new Example();

      

       Thread t1 = new TheThread(example);

      

       example = new Example();

      

       Thread t2 = new TheThread2(example);

      

       t1.start();

       t2.start();

    }

}

 

class Example

{

    publicsynchronizedstaticvoid execute()

    {

       for(int i = 0; i < 20; i++)

       {

           try

           {

              Thread.sleep((long)(Math.random() * 1000));

           }

           catch (InterruptedException e)

           {

              e.printStackTrace();

           }

          

           System.out.println("hello: " + i);

       }

    }

   

    publicsynchronizedstaticvoid execute2()

    {

       for(int i = 0; i < 20; i++)

       {

           try

           {

              Thread.sleep((long)(Math.random() * 1000));

           }

           catch (InterruptedException e)

           {

              e.printStackTrace();

           }

          

           System.out.println("world: " + i);

       }

    }

}

 

 

class TheThread extends Thread

{

    private Example example;

   

    public TheThread(Example example)

    {  

       this.example = example;

    }

   

    @Override

    publicvoid run()

    {

       this.example.execute();

    }

}

 

class TheThread2 extends Thread

{

    private Example example;

   

    public TheThread2(Example example)

    {  

       this.example = example;

    }

   

    @Override

    publicvoid run()

    {

       this.example.execute2();

    }

}

 

 

package com.itheima;

publicclass ThreadTest4

{

    publicstaticvoid main(String[] args)

    {

       Example2 e = new Example2();

 

       TheThread3 t1 = new TheThread3(e);

      

       e = new Example2();

      

       TheThread4 t2 = new TheThread4(e);

 

       t1.start();

       t2.start();

    }

}

 

class Example2

{

    private Object object = new Object();

 

    publicvoid execute()

    {

       synchronized (this)

       {

           for (int i = 0; i < 20; i++)

           {

              try

              {

                  Thread.sleep((long) (Math.random() * 1000));

              }

              catch (InterruptedException e)

              {

                  e.printStackTrace();

              }

 

              System.out.println("hello: " + i);

           }

       }

 

    }

 

    publicvoid execute2()

    {

       synchronized(this)

       {

           for (int i = 0; i < 20; i++)

           {

              try

              {

                  Thread.sleep((long) (Math.random() * 1000));

              }

              catch (InterruptedException e)

              {

                  e.printStackTrace();

              }

 

              System.out.println("world: " + i);

           }

       }

      

      

    }

}

 

class TheThread3 extends Thread

{

    private Example2 example;

 

    public TheThread3(Example2 example)

    {

       this.example = example;

    }

 

    @Override

    publicvoid run()

    {

       this.example.execute();

    }

}

 

class TheThread4 extends Thread

{

    private Example2 example;

 

    public TheThread4(Example2 example)

    {

       this.example = example;

    }

 

    @Override

    publicvoid run()

    {

       this.example.execute2();

    }

}

GoldenDB 兼容模式冲突场景解析:MySQL 连接模式 vs Oracle 语法兼容 阅读详情

相关推荐

别再为GEE注册发愁了!用谷歌Cloud Project,5分钟搞定谷歌地球引擎账户(保姆级图文)

本文提供2024最新版谷歌地球引擎(GEE)账户注册的保姆级教程,通过谷歌Cloud Project快速完成注册,5分钟极速通关。详细解析注册前的准备、分步图解流程、常见误区及解决方案,帮助用户避开90%的注册陷阱,直达GEE核心功能区。

weixin_42557830的博客 199

day14-多线程01

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。 1.2并发和并行【理解】 并行:在同一时刻,有多个指令在多个CPU上同时执行。 并发:在同一时刻,有多个指令在单个CPU上交替执行。 1.3进程和线程【理解】 进程:是正在运行的程序 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位 动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态

weixin_48048140的博客 402

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

黑马程序员-线程

Java 线程理解的学习

甘为码农 641

本体研究综述(转)

(这篇文章是从http://imarine.blog.163.com/中转载过来的,个人觉得对本体的介绍比较全面!)本体综述本体作为一种能在语义和知识层次上描述领域概念的建模工具,其目标是捕获相关领域的知识,确定该领域内共同认可的词汇,通过概念之间的关系来描述概念的语义,提供对该领域知识的共同理解。语义Web(the Semantic Web)是在本体理论基础之上对现有Web所进行的扩展[

zhenshideni611的专栏 1838

Win11系统下Abaqus2022与VS2022+oneAPI2023环境配置全攻略(附VUMAT子程序避坑指南)

本文详细指导在Windows 11系统下,为Abaqus 2022配置Visual Studio 2022与Intel oneAPI 2023的Fortran编译环境,以支持VUMAT等用户子程序开发。内容涵盖软件安装顺序、环境变量关联、快捷方式修改及关键验证步骤,并提供了首个VUMAT子程序的实战编写与模型验证方法,帮助用户高效搭建稳定可靠的仿真开发平台。

pytorch8learner的博客 316

黑马程序员--多线程

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 注:视频来源,毕向东老师的 JAVA 基础视频。一、线程和进程1)进程:是一个在执行中的程序。每一个进程都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。2)线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。3) 理解:一个进程中,至少有一个线程。在JVM 启动的时候会有一个进程叫java

sinat_29779023的博客 971

新能源车主必看:用高德API+充电站数据制作跨城出行充电规划工具(附完整代码)

本文为新能源车主提供了一份详细的跨城出行充电规划工具构建指南。通过整合高德地图API与充电站数据,手把手教你使用Python开发一个智能规划系统,可自动规划路线并推荐沿途充电站,有效缓解里程焦虑。文章包含完整代码、核心算法解析及可视化实现,帮助车主实现个性化、高效的出行规划。

tgb3456789的博客 899

黑马程序员——多线程原来是这么简单

一直以来对于多线程有种恐惧恐惧感,不理解它到底是什么回事,感觉挺抽象的,自从听了传智播客的邹老师对于多线程的讲解,我可以很自信地说我多线程方面入门了,特别是邹老师对于多线程有一套独有的方法,那就是画图,通过画图可以很直观地告诉你多线程是什么回事,比如UI线程和主线程,前台线程和后台线程,通过案例的讲解让你发现多线程的美妙。以下简单从如何创建多线程开始。首先来看用单线程的缺点: 通过对比单线程和多

我想我是海 冬天的大海 心情随风轻摆 1102

【实战】ComfyUI-Impact-Subpack插件安装与UltralyticsDetectorProvider节点修复全流程

本文详细解析了ComfyUI中UltralyticsDetectorProvider节点缺失的原因,并提供了完整的ComfyUI-Impact-Subpack插件安装与修复全流程。核心在于Impact Pack插件架构调整导致节点被拆分至子插件包。指南涵盖手动安装、依赖安全配置、模型文件管理及深度排错步骤,帮助用户彻底解决节点缺失问题,恢复工作流正常运行。

weixin_29290947的博客 437

Qt和FFmpeg的视频压缩工具

m_progressDialog = new QProgressDialog("正在压缩视频...", "取消", 0, 100, parent);QString file = QFileDialog::getOpenFileName(this, "选择视频文件", "",QString file = QFileDialog::getSaveFileName(this, "保存压缩文件", "",QMessageBox::warning(parent, "错误", "请设置输入和输出文件路径");

寒寒豆豆软件公司的博客 101

黑马程序员_多线程_1

进程:一个正在执行的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径或者控制单元线程:进程中一个独立的控制单元,线程控制着进程的执行一个进程至少有一个线程两种创建线程的方式: 一、 1、定义类,集成Thread 2、复写run方法,将自定义代码存储在run方法中,让线程运行 3、调用线程的start方法,该方法两个作用:启动线程,调用run方法二、 1、定义类实现Runnable

wu_zida的博客 464

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 639

多线程(黑马程序员学习笔记)

本文是黑马程序员Java视频教程的学习笔记,重点介绍了进程、线程及其在Java中的实现方式。进程是系统资源分配的基本单位,具有独立性、动态性和并发性;线程是进程中的任务执行单元,多线程能提高执行效率。Java中开启线程的方式包括继承Thread类、实现Runnable接口和实现Callable接口,分别适用于不同场景。文章还详细讲解了线程的常用方法,如获取线程名称、线程休眠、设置优先级和守护线程等。此外,探讨了线程安全问题及解决方案,如同步代码块、同步方法和Lock锁,并介绍了死锁的产生条件及避免方法。

A2294249395的博客 1636

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

黑马程序员 线程相关的学习记录

/*多线程的实现方式 1.继承Thread类 2.定义一个类MyThread继承Thread类 3.在MyThread类的对象 4.启动线程 重写run()方法的原因:run()方法是封装被线程执行的代码 run()和start()方法的区别: run():封装线程执行的代码,直接调用,相当于普通方法的调用 start():启动线程;然后JVM调用此线程的run()方法 获得线程名的3个方法: .

qq_45271696的博客 132

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

黑马程序员线程池

学习

qq_54478385的博客 780

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

黑马程序员_多线程

多线程的基础知识

weixin_51429898的博客 1323

黑马程序员—线程概述

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 多线程: 线程是依赖着进程存在的进程: 正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。 线程: 是进程中的单个顺序控制流,是一条执行路径 一个进程如果只有一条执行路径,则称为单线程程序。 一个进程如果有多条执行路径,则称为多

zllqxy931009的博客 410

黑马程序员——多线程

菜鸟黑马     第一次开通博客,略微有些兴奋,在这个全民自由发言的时代,我也可以在互联网上写出自己的文章,这对不太喜欢表达自己内心想法的我来说是一次不小的突破,就当成 自己的日记来写吧。     15年考研的硝烟还没完全散去,知道成绩的那一刻,就觉得今年要没戏了,毕竟东南大学的通信专业是不好考的,又赶上今年国家政策变化,留给通信专硕统招的名额只有 三十多个,东南大学,以后有缘再续! 读研

hpu186的专栏 522

黑马程序员——线程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------   线程是什么呢?我们可以把一个应用比作是一个公司,然后一个线程就是公司里面的每一个员工,我们每个员工都在做自己的工作,从而使公司有条不乱的运作下去。要了解线程是什么,那么首先要了解进程是什么。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多

Camwly的博客 489

黑马程序员-线程池

-------android培训、java培训、期待与您交流!---------- 线程池概念:   比如说某一个服务器访问量很大,不用线程池的时候就是有一个人去访问它就创建一个线程,结束后该线程也结束了,同时有成百上千的人访问就会有成百上千个线程被创建、销毁,在这个过程中不仅消耗时间还为服务器增加负担,如果人很多的情况下还有可能撑爆服务器。而线程池是一个池子里面先就预留了很多线程,...

weixin_33915554的博客 329

黑马程序员--线程篇

《线程基础篇》 ----------------------------------------------------------------------------------------------------------------- 多线程概述:        进程:进程就是一个正在进行着的程序;        线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行; 创

u013485029的专栏 958

【黑马程序员】多线程总结

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-这是我学习多线程两天后对于不明白的地方上网查阅大量资料后,针对一些难点做的一些总结.线程的状态:新建状态:新创建线程对象,但是该线程尚未运行。就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。此线程开始运行,等待获取CPU的使用权。运行状态:就绪状态的线程获取了CPU使用权,开始执行他的run方

u014461902的博客 483

多线程(黑马程序员)

newCachedThreadPool():线程数量随任务增加而增加,只想完毕60s挂掉。newFixedThreadPool(int ):创建固定数量线程池(挂了补充)newSingleThreadExecutor:创建单个线程线程池(挂了补充)参数六:threadFactory:指定线程池的线程工厂(创建线程)参数七:handler:指定线程池的任务拒绝策略(都满了怎么处理)参数二:maximumPoolSize:指定线程池最大线程数量。参数四:unit:临时线程存活时间单位(秒,分,时,天)

weixin_74390886的博客 1430

Java黑马程序员-多线程笔记

哔哩哔哩java黑马视频笔记

luohanisme的博客 1457
上一篇: 黑马程序员反射和代理模式
下一篇: 黑马程序员java I/O系统1
lamstudyingnet
博客等级 码龄15年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值