多线程

Ruby 多线程 多线程是一种允许单个程序同时执行多个任务的技术。在传统的单线程程序中,任务通常是顺序执行的,这意味着如果一个任务需要较长时间才能完成,它会阻塞后续任务的执行。而在多线程环境中,程序可以同时运行多个线程,每个线程执行一个独立的任务,从而提高了程序的效率和响应速度。 阅读详情


public class TestCase extends junit.framework.TestCase{
 
 //进程:正在执行中的程序,每一个进程执行都有执行的顺序,该顺序是一个执行路径或控制单元,至少有一个线程
 //线程:进程中真正执行的部分,控制着进程的执行,


 /*创建线程
  * 1、集成Thread类,复写Thread类的run方法(Thread类中的run方法,用于存储线程要运行的代码)
  * 2、实现Runable接口,覆盖run方法,通过Thread建立线程对象,将runable接口的子类对象传递给Thread的构造函数
  * 调用Thread类的start方法
  * 两种方法的区别
  * 避免单继承的局限性(建议使用Runnable)
  *
  * Thread.currentThread获取当前线程对象,静态的
  * */

class Thread1 extends Thread{

      public void run(){

       }

}

classThread2 implements Runnable{

   public void run(){

}

}
 
/*
 * 多线程的运行出现安全问题
 * 问题的原因:当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,就切换了另一个线程
 * 解决办法:
 *  对多条操作共享数据的语句,只能让一个线程都执行完,执行过程中,不让其他线程执行
 * 同步代码块:锁
 * synchronized(对象){
 *  
 * }
 * 同步的前提:至少两个以上的线程,多个线程使用一个锁,必须是一个线程执行
 * 好处:解决了安全问题
 * 弊端:消耗资源,判断锁
 * 如何找问题:
 * 1、明确哪些代码是多线程运行代码
 * 2、明确共享数据
 * 3、明确多线程运行代码中哪些语句是操作共享数据的
 *
 * 同步函数:public synchronized void add(){}
 * 同步函数用的锁:函数需要被对象调用,那么函数都有一个所属对象引用,就是this.所以同步函数使用的就是this
 * 如果同步函数被static修饰,锁不是this,因为静态方法中不可以定义this
 * 静态进内存,内存中没有本类对象,但是一定有该类对应的字节码文件对象
 * 类名.class 该对象的类型是class
 * 静态的同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class
 */

 public void test2(){
  Ticket t = new Ticket();
  Thread t1 = new Thread(t,"1号窗");
  Thread t2 = new Thread(t,"2号窗");
  Thread t3 = new Thread(t,"3号窗");
  Thread t4 = new Thread(t,"4号窗");
  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }
}

class DemoRun extends Thread{
 //private String name;
 //DemoRun(String name){
 // this.name=name;
 //}
 DemoRun(String name){
  super(name);
  }
 public void run(){
  for(int i=0;i<50;i++)
  System.out.println(Thread.currentThread().getName()+"demorun ==="+i);
 }
 
}

class Ticket implements Runnable{
 
 private int ticket=100;
 Object ob =new Object();
 public void run(){
  while(true){
   //同步代码快
   synchronized(ob){//ob锁,线程进去,锁关闭,其他线程进不来。出去释放锁,其他线程进入
    if(ticket>0){
     System.out.println(Thread.currentThread().getName()+"ticket-no-"+ticket--);
    }
   }
  }
 }
}

class Tickets implements Runnable{
 
 private int ticket=100;
 Object ob =new Object();
 public void run(){
  while(true){
    show();
   }
 }
 //同步程序
 public synchronized void show(){
  if(ticket>0){
   System.out.println(Thread.currentThread().getName()+"ticket-no-"+ticket--);
  }
 }
}

//单例(饿汉式)
class SingleOne{
 private static final SingleOne s = new SingleOne();
 private SingleOne(){}
 public static SingleOne getInstance(){
  return s;
 }
}


//单例(懒汉式)  懒汉式在多线程调用时线程不安全,可采用同步解决,同步代码块(
//双重判断用的锁是该类对应的字节码文件对象)与同步函数
class SingleTwo{
 private static SingleTwo s = null;
 private SingleTwo(){}
 public static SingleTwo getInstance(){
  if(s==null){
   synchronized (SingleTwo.class) {
    if(s==null){
     s = new SingleTwo();
    }
   }
  }
  return s;
 }
}

/*
 * 死锁
 * 同步中嵌套同步
 */

 

 

-------------------------------------------------------------------//JDK1.5以后对锁进行了升级-----------------------------------------------------------------------

 

 /*
   * 线程间通信:
   * 多个线程在操作同一个资源,但操作动作不同
   *
   * 等待唤醒机制
   * wait notify  notifyAll 都是用在同步中,因为要对持有监视器(锁)的线程操作
   * 所以要使用在同步中,因为只有同步才具有锁。定义在Object中
   * 等待和唤醒必须是同一把锁,锁是任意对象
   *
   * 当多个生产者与多个消费者  要用while循环判断,
   * 用notifyAll唤醒所有线程,(会出现问题),需要生产者等待时唤醒消费者,消费者者等待时唤醒生产者

   * jdk1.5后提供Lock接口,通过lock实例化Condition接口,Condition 将 Object 监视器方法(wait、notify 和notifyAll)分解成截然不同的对象

  * 始终用的是同一把锁,不会出现死锁现象
   */
 public void test1(){

  //实例化资源(两个生产者,两个消费者,生产一个消费一个)
  Resource r = new Resource();
  new Thread(new Producer(r)).start();
  new Thread(new Consumer(r)).start();
  new Thread(new Producer(r)).start();
  new Thread(new Consumer(r)).start();
  
 }
 
 
}
//放进去取出来

//资源类,用于生产商品和消费商品
class Resource{
 private String name;//商品名称
 private int count;   //商品编号
 private boolean flag; //用于判断,资源类中是否有商品存在
 private Lock lock = new ReentrantLock();//创建锁
 private Condition condition_pro = lock.newCondition();//创建Condition  代表生产者
 private Condition condition_con = lock.newCondition();//代表消费者
 public void set(String name) throws InterruptedException{ //生产商品
  lock.lock();//获取锁
  try{
   while(flag)   //循环判断当资源库中有商品时,生产者等待
    condition_pro.await();
   this.name = name+"--"+count++;
   System.out.println(Thread.currentThread().getName()+"-pro-"+this.name);
   flag = true;
   condition_con.signal();//唤醒消费者,消费者获得执行资格,还没有执行权,此时生产者继续进行,到上面await()那冻结
  }finally{
   lock.unlock(); //结束时必须将锁释放
  }
 }
 //消费者
 public void out() throws InterruptedException{
  lock.lock();
  try{
   while(!flag)
    condition_con.await();
   System.out.println(Thread.currentThread().getName()+"-con-"+this.name);
   flag = false;
   condition_pro.signal();
  }finally{
   lock.unlock();
  }
 }
}

//创建生产者线程
class Producer implements Runnable{
 private Resource r;
 Producer(Resource r){
  this.r=r;
 }
 public void run(){
  while(true){
    try {
     r.set("打狗棒");
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
}

//创建消费者线程
class Consumer implements Runnable{
 private Resource r;
 Consumer(Resource r){
  this.r=r;
 }
 public void run(){
  while(true){
   try {
    r.out();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

 


 

 

使用Simulink对氢燃料电池与锂电池的混合储能系统进行建模 本文介绍了基于Simulink的氢燃料电池与锂电池混合储能系统建模与协同控制方法。系统通过氢燃料电池提供稳定能源,锂电池实现快速响应,结合DC-DC变换器和负载管理器实现动态调控。详细阐述了从模型创建、关键模块配置到控制器设计的完整流程,重点说明了功率分配算法和充放电控制策略的实现。通过仿真分析验证了系统在不同负载条件下的性能表现,包括响应速度、工作效率和稳定性等指标。该方案为新能源混合储能系统的设计与优化提供了实用指导,有助于提升系统可靠性和延长电池寿命。 阅读详情

相关推荐

C++ bitset总结

数据结构bitset 术语:某1位置位是置1,某一位复位是某一位清零。 文章目录数据结构bitset一、3种初始化方式二、位访问三、位操作四、 位集操作总结实战练习 一、3种初始化方式 bitset<32> tmp; //默认构造函数,默认全0。 bitset<32> tmp(-1); //从整形数构造 bitset<32> tmp("101"); //从包含1和0的字符串构造 二、位访问 bitset<32> tmp(256)

qq_43807092的博客 721

Arduino的多线程

前言 本章节是如何使用Arduino 的多线程技术。截止目前,Arduino 的性能很棒,但是如果我们想在不同的时间间隔中,完成两件、多件的任务呢? 此时,我们就需要使用一种类多线程技术来处理项目。 Arduino 的多线程 \ 类多线程? 为了正确理解多线程技术和Arduino 之间的关系,我们需要理解为什么它不是真正的多线程。 在计算机CPU上,多线程应用程序...

TEST_PROGRAM_NONE 3万+

PCIe中ACS知识小记

虚拟机内部的访问数据显而易见是带的GPA地址。而目前几乎所有的PCIe 设备都带ACS control,所以它们可以单独assign给不同的VM,但是随之而来的就是即使两个GPU同时assign给同一个VM,由于ACS的存在,他们之间也不会有真正的物理层面的P2P访问。每一个TLP都自带一个address(寻址类TLP),同时每一个endpoint,PCIe switch都自带一段BIOS配置的地址空间范围,一旦这个TLP的address落入某个设备的地址范围,那么这个TLP就属于这个设备并消费。

Summer的博客 5079

多线程一,什么是多线程,创建多线程的几种方式

1 多线程相关概念 并发(Concurrent):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。 同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行(Parallel):当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为

世上哪有什么岁月静好,不过是有人替你负重前行 2万+

基于STM32与HRTIM的四开关Buck-Boost双向DC-DC电源设计实战(附源码、仿真与设计解析)

本文详细介绍了基于STM32F334的HRTIM高分辨率定时器实现四开关Buck-Boost双向DC-DC电源的设计实战。通过精准的PWM控制、双环PID算法和智能模式切换逻辑,解决了电压震荡与效率优化等关键问题,并提供了完整的源码、PSIM仿真及参数计算,为高性能电源设计提供了实用参考。

7z8x2c4v6b9的博客 300

【vue看板】

大屏看板提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:代码量较多,看板中的。

weixin_46223284的博客 2772

Qt多线程

Qt 提供了多种方式来处理多线程编程,它不仅使多线程操作更易于管理,还与 Qt 的事件驱动架构紧密集成。下面是 Qt 多线程编程的详细介绍,包括关键类、模式以及常见的使用场景。

強雲的博客 2356

华为eNSP实战:手把手教你配置DHCP全局地址池(含AP固定IP分配)

本文通过华为eNSP模拟器,详细演示了如何配置DHCP全局地址池,为不同业务VLAN动态分配IP地址,并重点讲解了如何通过MAC地址绑定为接入点(AP)分配固定IP。文章涵盖了从拓扑设计、基础网络搭建到地址池精细配置、验证测试及常见故障排查的全流程,是网络工程师掌握企业级DHCP部署与AP管理的实用指南。

weixin_29235923的博客 600

一文讲清多线程和多线程同步

一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用2个例子作说明。同一进程内的多个线程会共享数据,对共享数据的并发访问会出现(竞争状况)。协调多个线程对共享数据的访问,避免出现数据不一致的情况。

excellent_fish_c的博客 1925

树莓派4B玩转ROS2 Humble:Ubuntu Desktop一键安装与配置教程

本文详细介绍了在树莓派4B上安装和配置ROS2 Humble的完整教程,包括硬件准备、Ubuntu Desktop系统安装、一键部署ROS2、网络配置优化以及常见问题解决方案。通过简化安装流程和性能调优技巧,帮助开发者快速搭建机器人开发环境,充分发挥树莓派4B在ROS2应用中的潜力。

w8x9y0z1的博客 969

【CAN总线测试】——通讯相关诊断测试

本章主要介绍通讯相关诊断测试用例设计

LOVE135149的博客 1818

C++多线程-多线程调试

软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。 #include <stdio.h> int value = 0; void test() { int total; int index; total = 0; ...

逍遥云恋 2382

由异常的测试眼图引发的深入思考

信号测试中出现“双眼皮”的眼图测试效果,可能的导致因素总结如下:PCB通道阻抗设计不匹配,负载端出现严重反射;发射端采用了不当的信号预处理;接收器均衡处理不当;通道串扰严重... 基于以上的假设,本文就逐一分析下这些因素到底是如何对正常的信号眼图造成影响的。

一只豌豆象的博客 3064

php 怎么实现多线程,php 实现多线程

通过php的Socket方式实现php程序的多线程。php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的。每一个访问者,当访问WEB页面的时候,都将调用新的线程,通过这一点我们可以利用WEB服务器自身的线程来解决PHP不支持多线程的问题。下面给出通过 fsockopen() 建立socket连接,然后用 用fputs() 发送消息,来实现的PHP...

weixin_28756427的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

什么是多线程

什么是多线程? 多线程是一种同时执行多个线程的技术,它不允许进程或操作系统生成计算机中运行的程序的多个副本,而是在不创建程序多个副本的情况下,同时管理多个用户或同一用户的多个请求。 线程是轻量级进程,是处理的最小单元,同时运行多个线程称为多线程。因此,基本上,这是一种由多个处理器使用单个代码集的方法。 了解多线程 1.为了理解多线程,需要理解两个术语。 (1)线程:线程是进程的独立或基本单元。 (2)进程:正在执行的程序称为进程,一个进程中存在多个线程。 2.多线程中的执行是并发的和并行的。 (1)并发执行

qf2019的博客 1万+

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

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

多线程爬虫

多线程简单描述就是指在一个进程中运行多个线程,以此来加快程序的运行效率。我们在写python代码时,那种按部就班,一步一步写完并执行的就是单线程;而在python中,想要实现多线程需要用到类Thread。

qq_75229677的博客 1849

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

单核多线程与多核多线程

单核多线程与多核多线程 或许有些同学对于单核多线程和多核多线程有点误区,因为会听到一些同学问为什么单核能处理多线程,总结了一些干货,下面会通俗说明下。 线程和进程是什么 线程是CPU调度和分配的基本单位(可以理解为CPU只能看到线程) 进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位 单核多线程 单核多线程指的是单核CPU轮流执行多个线程,通过给每个线程分配CPU时间片来实...

qq_27185561的博客 1万+

多线程的理解

多线程的理解 什么是多线程? ​ 多线程的简单理解,即:同时处理多个事项,宏观方面可以理解为计算机在cpu的调度下,同时进行多项工作;类比可以看做,武侠高手左手画圆,右手画三角形,同时进行;但是,实际上微观理解,单核cpu同一时间只能处理一件事情,所以是将各个线程分为细小的时间片来交替进行,但是由于相对于人类感官速度极快,产生统一时间俩件事情同时进行了。打个比方,现在用一台单核cpu计算机,同时打开俩个视频,只看视频播放画面,其实是将视频切割为一个个细小的时间片交替cpu调度执行,同一时间点,只有一个在被c

qq_36098674的博客 3194

多线程的类型

1 交错/临时多线程 (1)粗粒度多线程: 在一个线程运行到被一个通常会造成长延迟停顿的事件阻塞时,就会发生最简单类型的多线程。这种停滞可能必须访问片外存储器来弥补高速缓存的缺失,数据返回可能需要数百个CPU周期。线程处理器会在不等待停顿解决的情况下执行切换到另一个准备运行的线程。只有当前一个线程的数据到达时,前一个线程才会被放回到准备运行的线程列表中。 例如: 周期i:线程A发出指令j。 周期i + 1:线程A发出指令j + 1。 周期i + 2:线程A发出指令j + 2,这是一个在所有高速缓存中未被执行

iPwisdom的博客 2014

【多线程】多线程基础操作

想让线程结束,只需在 catch 中加上 break。当引入的线程到达一定数量后在尝试继续引入新的线程无法提升,当线程数量太多的时候,线程之间就会相互竞争CPU的资源(CPU核心数有限)非但不会提高效率,反而增加调度开销。操作系统进行"多任务调度"本质上是在调度PCB(线程在系统中的调度规则就和之前的进程是一样的,线程的PCB中也有状态,优先级,上下文,记账信息…5.每个线程,也是一个独立的执行流,可以执行一些代码,并且单独的参与到CPU调度中(状态,上下文,优先级,记账信息,每个线程都有自己的一份)

m0_50534425的博客 1557

Python多线程

想象你在厨房做饭:一边煮着汤,一边切着菜,偶尔还要看看烤箱里的蛋糕。这种同时处理多个任务的能力,就是多线程的生动体现。在计算机中,线程是程序执行的最小单位。多线程允许一个程序同时运行多个任务,特别适合I/O密集型操作(如网络请求、文件读写等)。适用场景I/O密集型任务(网络请求、文件操作等)需要保持响应性的GUI应用注意事项避免过度使用线程(线程也有开销)注意线程安全问题(使用锁、队列等)考虑使用线程池而非频繁创建线程替代方案CPU密集型任务:考虑multiprocessing。

陆小森_红齐飘飘的博客 2347

多线程及多线程程序的编写

线程的创建方法及多线程相关

weixin_54175406的博客 1981

多线程和并发、多线程编程

线程函数是线程执行的入口点。它应该接受一个指向void的指针作为参数,并返回一个void指针。c复制代码// 线程执行的代码。

wssc63262的博客 1650

认识多线程

认识多线程 多任务: 类似于生活中的一心二用,同时吃饭玩手机,或者边听歌边写作业 多线程: 类似于生活中的马路,为了提高使用的效率,多加了几条车道 普通方法调用和多线程 Process和Thread 程序是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念 进程则是执行程序的一次执行过程,他是一个动态的概念。是系统资源分配的单位 通常在一个进程中可以包含若干个线程,当然一个进程中至...

weixin_46178009的博客 1539

多线程以及python的多线程

1.1 线程和进程 进程:系统分配资源最小单位,进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。 线程:系统调度最小单位,线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

832
上一篇: jquery的$.extend和$.fn.extend作用及区别
下一篇: Oracle创建新用户
zyb_java
博客等级 码龄14年 8粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值