Java中线程入门

解密GPT-5-Codex CLI安全最佳实践:从API Key保护到沙箱模式详解 本文深入解析GPT-5-Codex CLI在企业环境中的安全最佳实践,涵盖API Key全生命周期管理、沙箱模式配置及网络传输加固等核心防护策略。通过分层存储方案、动态环境变量加载和精细化权限设计,帮助开发团队构建企业级AI编程助手的安全防线,有效预防密钥泄露和未授权访问风险。 阅读详情

多线程入门

入门案例

package com.cloud.day1;

/*

线程的创建方式

方式一:

   1.自定义一个类,继承Thread类

   2.重写Thread类的run方法,run方法编写自定义线程的任务代码

   3.创建Thread子类对象,调用start方法执行线程,线程一旦开启,会自动调用run方法,

      如果直接调用run方法,只是单纯调用一个方法

 */

public class Demo1 extends Thread{

   @Override

   public void run() {

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

        System.out.println("自定义线程"+i);

      }

   }

   public static void main(String[] args) {

      //自定义线程

      Demo1 d1=new Demo1();

      d1.start();

      //主线程任务

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

        System.out.println("main线程"+i);

      }

   }

}

线程生命周期

1.      当new 线程对象()的时候,线程处于创建状态

2.      线程调用start()方法时,处于可运行状态,此时的线程具备等待CPU的资格,不具备CPU的执行权

3.      程序运行时,得到CPU的执行权,也具备CPU的等待资格

4.      线程调用sleep()和wait()方法时,会进入临时阻塞状态,调用sleep休眠的线程,过了休眠期可以进入可运行状态,调用wait方法的线程,需要其他线程唤醒才可以进入可运行状态

5.      当CPU的执行权被抢夺,线程回到可运行状态

6.      线程完成任务时候处于死亡状态

线程常用的方法

方法使用案例

package com.cloud.day1;

public class Demo2 extends Thread{

   public Demo2(String name){

      super(name);

   }

   @Override

   public void run() {

      System.out.println(this);

      System.out.println("当前函数调用"+Thread.currentThread());

      /*

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

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

      }

      */

   }

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

      Demo2 d = new Demo2("Spring");

      //System.out.println("线程的默认名字:" + d.getName());//线程的名字Thread-0

      System.out.println("自定义名称:"+d.getName());

      //这里休眠的是main主线程,谁调用谁休眠,d.sleep(也是主线程休眠),因为是main线程调用的

      //Thread.sleep(1000);

      System.out.println("自定义线程的优先级"+d.getPriority());//5

      System.out.println("主线程的优先级"+Thread.currentThread().getPriority());

      d.setName("summer");

      d.setPriority(10);//设置优先级

      d.start();

   }

}

 

run方法的异常处理

在java的异常处理中,子类方法抛出的异常只能小于等于父类抛出的异常,也就是说父类不抛出异常,子类只能用捕获异常的方式处理异常。

线程的优先级

线程的优先级是指获取CPU的概率,默认是5,数字越大,优先级越大。优先级【1-10】之间,优先级高不代表一定先执行,只是先执行的概率大。

 

线程模拟卖票系统

package com.cloud.day1;

/*

需求:模拟3个窗口同时在售50张票。

问题1 :为什么50张票被卖出了150次?

出现的原因:因为num是非静态的,非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份。

解决方案:把num票数共享出来给三个线程对象使用。使用static修饰。

问题2:出现了线程安全问题 ?

线程安全问题的解决方案:sun提供了线程同步机制让我们解决这类问题的。

   java线程同步机制的方式:

      方式一:同步代码块

        同步代码块的格式:          

           synchronized(锁对象){

              需要被同步的代码...

           }

同步代码块要注意事项:

      1. 任意的一个对象都可以做为锁对象。

      2. 在同步代码块中调用了sleep方法并不是释放锁对象的。

      3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率的。

      4. 多线程操作的锁对象必须是唯一共享的。否则无效。

需求:一个银行账户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。


      方式二:同步函数

出现线程安全问题的根本原因:

   1. 存在两个或者两个以上的线程对象,而且线程之间共享着一个资源。

   2. 有多个语句操作了共享资源。

*/

class SaleTicket extends Thread{

   static int num=50;

   static Object o = new Object();

   public SaleTicket(String name){

      super(name);

   }

   @Override

   public void run() {

      while(true){

        synchronized (o) {

           if(num>0){

              System.out.println(Thread.currentThread().getName()+"卖出"+num+"号票");

              num--;

           }

           else{

              System.out.println("票卖完了...");

              break;

           }

        }

      }

   }

}

public class Demo3 {

   public static void main(String[] args) {

      SaleTicket sale1 = new SaleTicket("窗口1");

      SaleTicket sale2 = new SaleTicket("窗口2");

      SaleTicket sale3 = new SaleTicket("窗口3");

      sale1.start();

      sale2.start();

      sale3.start();

   }

}

同步函数解决线程安全

package com.cloud.day1;

/*

进程:正在运行的应用程序,决定了内存的划分

线程:进程中的代码是线程执行的,线程是进程中的一个执行路径

多线程:一个进程可以有多个线程执行任务


多线程好处:

   1.解决一个进程中可以执行多个任务的问题

   2.提高资源的利用率

弊端

   1.增加了CPU的负担

   2.降低进程中线程执行的概率

   3.出现线程安全问题

      出现原因:

      a.存在两个或者两个以上的线程共享同一个资源

      b.多线程操作共享资源的代码有多句

   4.出现死锁现象


解决线程安全

   1.同步代码块

   synchronize("锁"){

      同步代码

   }

   锁对象可以是任意的对象,但是必须是唯一的,线程休眠不会释放锁对象

   不存在线程安全问题,不使用同步代码块,会降低效率,锁对象必须是多线程共享的资源

   2.同步函数

   public synchronize void run(){

      同步代码

   }

   a.非静态的同步函数的锁对象是this对象,如果是静态函数同步的锁,锁对象是当前函数所属类的字节码文件(class对象)

 */

class BankThread extends Thread{

   static int count = 5000;

   public BankThread(String name){

      super(name);

   }

   @Override

   public void run() {

      getMoney();

   }

   //静态函数--》函数所属类字节码文件对象--》BankThread.class 具备唯一性

   public static synchronized void getMoney(){

      while(true){

        if(count>0){

           System.out.println(Thread.currentThread().getName()+"取走1000,剩余"+(count-1000));

           count-=1000;

        }

        else{

           System.out.println("取光了...");

           break;

        }

      }

   }

}

public class Demo4 {

   public static void main(String[] args) {

      BankThread th1 = new BankThread("存折");

      BankThread th2 = new BankThread("银行卡");

      th1.start();

      th2.start();

   }

}

线程的死锁现象

package com.cloud.day1;

/*

同步代码块解决线程安全问题,但是也带来了线程死锁问题

死锁现象:互相等待对方的资源

   原因:

   1.存在两个或者以上的线程

   2.存在两个或者以上的共享资源

死锁现象只能尽量避免,不能彻底解决

*/

class DeadLock extends Thread{

   public DeadLock(String name){

      super(name);

   }

   @Override

   public void run() {

      if("抢电源".equals(Thread.currentThread().getName())){

        synchronized ("抢电源") {

           System.out.println("抢到电源,等待遥控");

           synchronized ("抢遥控") {

              System.out.println("1可以开空调了...");

           }

        }

      }else if("抢遥控".equals(Thread.currentThread().getName())){

        synchronized ("抢遥控") {

           System.out.println("抢到遥控,等待电源");

           synchronized ("抢电源") {

              System.out.println("2可以开空调了");

           }

        }

      }

   }

}

public class Demo5 {

   public static void main(String[] args) {

      DeadLock dl1 = new DeadLock("抢电源");

      DeadLock dl2 = new DeadLock("抢遥控");

      dl1.start();

      dl2.start();

   }

}

Linux ARM平台开发系列讲解(GMSL摄像头篇)1.2 MAX9296 GMSL链路配置 串行器 +解串器组成,软件需要做的就是写这三部分的驱动,让摄像头数据能到达。3. 配置解串器和串行器的GMSL链路。串行器和解串器上电成功之后,就可以配置。软件配置(注意软件只可以配置速率,2. 9296上电,使能芯片。的版本和速率,比如版本是配置。配置成功之后,就会出现串行器。的链路,其它同类型的。设备地址,我设置的是。... 阅读详情

相关推荐

瑞萨单片机,把CS文件转换为CC

1、打开CC的软件: 点击坐上角的"START" 点击"Create New Project"的"GO": 导入工程: 如下图设置后,点击"Create" 2、进入到CC的开发界面: 可以看到原启动库文件以asm文件的方式直接出现在工程中: 删除新生成的main.c,保留导入的r_main.c(以你自己的代码为准): 注意添加所有的头文件路径: 点击"...

weixin_37611121的博客 1228

线程创建方式

创建线程的3种方式: 1)继承Thread类 ①自定义线程类继承Thread,重写 run() 方法,把线程要做的任务写在run()方法中。 ②创建自定义线程对象,调用 start()方法启动线程。 //1,自定义线程类继承Thread,重写 run() 方法,把线程要做的任务写在run()方法中 Thread mt = new Thread(){ public void run(

旒阆的博客 285

手把手教你解决Keil5安装时xerces-c_3_0.dll缺失和0xc000007b报错(附文件下载与路径设置)

本文详细解析了Keil5安装过程中常见的xerces-c_3_0.dll缺失和0xc000007b报错问题,提供了从文件获取、路径设置到系统配置的完整解决方案。同时,文章还涵盖了STM32开发环境的搭建技巧和最佳实践,帮助开发者快速构建稳定的嵌入式开发环境。

weixin_29164497的博客 600

关于多线程共享资源的方式

package com.joker.threads.demo.thread.mainsub; /**  * 多线程共享数据的方法  * @author GQ   */ public class MuiltThreadTest { private static int j; public static void main(String[] args) { MuiltT

千年祸害万年牢 581

针对中文CLIP模型训练失效的解决方案记录

解决了中文CLIP模型无法正确训练的问题

weixin_45906434的博客 1621

超详细版risc-v五级流水线cpu硬件设计实现解析

深入剖析risc-v五级流水线cpu的硬件架构与设计细节,涵盖指令流程、模块划分与关键时序控制,帮助理解risc-v五级流水线cpu的工作机制与优化策略。

weixin_42437253的博客 1631

Java中线程简单入门

1.线程是一个进程中的执行场景/执行单元,一个进程可以启动多个线程。比如以java为例,在DOS命令窗口运行一个java文件,此时会先启动JVM,而JVM就是一个进程,JVM会启动一个主线程调用main方法,同时再启动一个垃圾回收线程负责看护,回收垃圾,所以至少有两个线程并发。 两个进程之间的内存独立不共享,而属于同一进程的两个线程A、B会共享一定的资源,在java中,线程A和线程B共享堆内存和方法区内存,但是栈内存独立,一个线程一个栈,栈与栈之间互不干扰,各自执行各自的,这就是多线程并发。 ...

xxyneymar的博客 268

【随机过程】Markov Chain的定义及发展历程与实际应用

本模块书写的初衷:由于在学习张波张景肖等学者所著的《应用随机过程》存在着不甚了解的知识点,经过个人查找资料并整理、分享,希望能够为有同样疑惑的读者贡献绵薄之力,同时如果个人编写内容有错误,恳请读者指正。本文为对《应用随机过程》第42页中Markov Chain基本概念的补充。1.Markov Chain的定义俄国数学家 Andrey Andreyevich Markov 研究并提出一个用数学方法就能解释自然变化的一般规律模型,被命名为马尔科夫链(Markov Chain)。

qq_49657150的博客 3743

java中线程的知识入门了解03

距离上次了解线程已经过去一年半,现在我再次开始线程的理解。还是先从基础开始。这里不直接上代码,先把概要弄明白。 我这里提到的是java中传统的多线程。以下分几个方面去讲: ①概念:线程是在当代的操作系统中可以独立并发执行的基本单元,它轻量、独立、资源共享。 ②实现线程:我一年半前关于线程的第一篇博客就已经说明,java中多线程就两种实现方式。1、继承Thread类,重写run()方法。2、实

去武帝城,战王仙芝 303

美团mtgsig 1.2算法分析

mtgsig1.2的一些算法总结

记录一些web逆向的过程 3500

uniapp - 实现安卓App打包上架应用商店详细教程,详解Hbuilder打包编译apk发布上传到应用市场全流程,提供uniApp云打包、离线打包app、原生本地打包,附带APP备案和安卓证书申请

uni-app,安卓,APP,应用商店,打包编译apk,上架到应用市场,如何打包app并发布到主流应用市场,发布为AndroidApp流程,应用备案,如何申请安卓证书,hbuilder发布安卓apk后怎么上传到各家软件商店,创建app证书,uniapp发行原生APP本地打包安卓APK,详细最全的步骤教程,项目打包成apk,云打包,安心打包,安卓app离线打包,一直审核不通过,被拒绝,不符合规范,上架发布失败,申请安卓证书和获取证书信息,uni-app打包发布安卓Android软件到各大应用商店,腾讯应用

🏆 前端领域优质创作者 1万+

Java中线程的知识入门了解01

作为一个java学习者,这段时间一直在看关于线程的问题。所以总结下来,分享一下,若有错误,希望扫过这篇文章的人指出。在此万分感谢。 一,首先我们谈论线程(Thread),需要与他的近亲:进程(Process)一起比较才能明白。 那么进程(Process)是什么呢? 有人曾这样定义进程:是一个“执行中的程序”。不过我更喜欢用面向对象的概念来定义进程:进程是执行程序的实例。实际中我们使用电脑的一

去武帝城,战王仙芝 505

【Claude】权限被拒绝 (Permission Denied) 全场景排查 — 已解决

权限配置是 Claude Code 安全使用的核心机制。通过合理的 allow/deny 规则、正确的通配符使用、子代理独立配置、定期安全审计,可以在保证安全性的同时不影响开发效率。deny 优先:deny 规则优先级高于 allow,先保护敏感资源通配符精确单层匹配,**递归匹配,Bash(cmd*)允许带参数最小权限:只允许必要的操作,避免Bash(*)等危险规则CI 用 skip:Headless 模式用避免挂起子代理独立:每个子代理单独配置权限,不自动继承保护密钥:deny.env。

一键难忘的博客 3938

java中线程的知识入门了解02

为了进一步了解线程,我们从一个经典的买车票的例子开始。 假设铁道部的网站上有100张火车票,三个售票点一起开始卖票。我们用一个售票点一个线程来模拟,实现多线程。 先看一个程序: 输出结果如下: 以上说明:一个线程对象只能启动一个线程,无论你掉用多少遍start()方法都是不行的。 那么就会有人跟我一样会去尝试以下这种方法了。 修改原来的主函数里的内容,如下:

去武帝城,战王仙芝 454

OV9734 DATASHEET,完整规格书

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

初识Java并发编程(一)

初识Java并发编程(上) ​ ​ ​ ​ ​ ​ 笔记是根据某视频学习记录的,有一些地方做了精简。总体来说看的学习视频开头部分讲的还是有点简略的,不过好的地方是有实际操作,我觉得可以当作入门视频来看。之前学并发看的对某一个点进行深入剖析的视频和一些书籍,再重新过一遍基础,对掌握整个体系还是挺有帮助的,有些地方老师讲的还是挺不错的。 文章目录初识Java并发编程(上)1.进程与线程1.1进程与线程...

NayelyA的博客 994

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品。转载请注明出处http://blog.youkuaiyun.com/evankaka         写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java

猿猴技术博客 267

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

线程池快速入门及线程复用原理

线程池快速入门及线程复用原理 线程池-ThreadPoolExecutor常用方法 execute():提交任务 submit():提交任务,能够返回执行结果,获取异常。 shutdown():关闭线程池,等待任务都执行完。 shutdownNow():关闭线程池,不等待任务执行完。 getTaskCount():线程池执行任务总数(已执行+未执行) getCompletedTaskCount(): 已完成的任务数量。 getPoolSize(): 线程池当前的线程数量。 getActiveCount()

ChiZng的博客 434

java中线程的生命周期

文章目录java中Thread的状态NEWRunnableBLOCKEDWAITINGTIMED_WAITINGTERMINATED java中线程的生命周期 线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发。 java中Thread的状态 java中Thread有6种状态,分别是: NEW - 新创建的Thread,还没有开始执行 RU...

程序那些事 1万+

一图流解释Java中线程状态的转换

当线程对象被创建时,它处于新建状态。此时线程还没有开始执行。当线程对象被创建后,其他线程调用了该线程的start()方法,该线程进入就绪状态。处于就绪状态的线程可能正在等待CPU时间片,一旦获取到CPU时间片,就可以执行。线程获取到CPU时间片后,开始执行任务,处于运行状态。线程在某些情况下会进入阻塞状态,如调用sleep()方法、等待I/O操作完成、试图获取锁时被其他线程获取等。在这些情况下,线程暂时停止执行。线程进入等待状态是因为调用了wait()方法或类似的方法,该状态下线程会等待其他线程显式地唤醒。

luming的博客 2133

Java中线程的生命周期

本篇文章我们讨论下Java中的一个非常核心的概念:线程的生命周期。在Java编程语言中,多线程编程非常重要。线程从创建到销毁是有生命周期的,在线程的生命周期中,线程会经历多种状态(state)。线程是Java多线程编程的基础,本文讨论了Java中线程的生命周期,以及生命周期中可能出现的6种状态,每种状态都举例进行了说明。内容主要来源于: java-thread-lifecycle。

qq_66627105的博客 1594

Java 中线程的使用

本文主要介绍了,java 中怎么去使用线程 Thread 类,包括线程的创建方式,单线程与多线程的使用,用户线程与守护线程,死锁与互斥锁。

weixin_74200123的博客 1072

Java中线程的使用

方法后,它会进入等待状态,直到被等待线程执行完成,或者指定的超时时间到达。总结,第一种方式可以提前唤醒sleep,但抛出的异常会清空标志位,所以要认为在catch后加一个break,但第二种方式无法唤醒,只能等它自己起来,然后在循环中判断。这里后续清空标志位对循环已经没有影响了,但sleep被提前唤醒,会抛出异常,清空标志位,然后在会过去执行while中条件判断,此时要退出循环就要加一个break。方法是一个实例方法,它用于检查调用该方法的线程是否被中断,但不会清除中断状态。方法来检查线程的中断状态。

m0_74209411的博客 1384

【学习笔记】Java中线程的状态

本文介绍一下在 Java 语言中线程的几种状态。本文介绍在 Java 中线程的几种状态,同时给出了线程状态变迁图,我们需要知道的是调用什么样的方法会让线程进入什么样的状态即重点掌握线程状态变迁图的内容。

weixin_44801641的博客 1166

Java面试必备:Java中线程之间如何进行通信?

在Java中,线程之间的通信是指多个线程协同工作,以实现共享资源、任务分配和数据交换等目标。线程通信的核心在于如何安全、高效地共享数据和协调线程的执行顺序。本文将详细介绍Java中线程通信的几种主要方式,并通过流程图和示例代码帮助读者更好地理解这些机制。

qq_58299462的博客 1603

Java中线程的状态

Java中线程有6种状态NEW:新建状态。线程创建后,启动前处于该状态。RUNNABLE:可运行状态。线程正在执行任务处于该状态BLOCKED:阻塞状态。获取synchronized锁失败处于该状态WAITING:无限等待状态。a. 其他线程join进来b. 调用Object类wait()方法c. 获取Lock锁失败d. 调用Condition的await()方法;TIMED_WAITING:计时等待状态。a. 调用sleep方法。

qq_44648984的博客 974

Java 中线程状态有哪些?

写在前面 本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java并发 解答 线程的状态在java中有明确的定义,在java.lang.Thread.State中有6种。 ① NEW 线程被创建,未执行和运行的时候 ② RUNNABLE 不代表线程在跑,两种:被cpu执行的线程,随时可以被cpu执行的状态。 ③ BLOCKED 线程阻塞,处于synchronized同步代码块或方法中被

Shockang的博客 3万+
上一篇: Servlet中response响应
下一篇: Servlet中路径详解
午-夜
博客等级 码龄12年 95粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值