Java多线程与并发编程

Java 多线程与并发编程全面指南 Java 作为一门成熟的企业级编程语言,提供了丰富的多线程与并发编程支持,使开发者能够构建高性能、高并发的应用程序。然而,多线程编程也带来了复杂性,包括线程安全、死锁、竞态条件等问题。本文将全面介绍 Java 多线程与并发编程的各个方面。 阅读详情

1.多线程基础

1.1 线程相关概念

程序(program):是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码

进程:
        1. 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用微信,又启动了一个进程,操作系统将为微信分配新的内存空间。
        2. 进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

线程:
        1. 线程由 进程创建的,是进程的一个实体
        2. 一个 进程可以拥有多个线程

其他相关概念:
        1. 单线程:同一个时刻,只允许执行一个线程
        2. 多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口。
        3. 并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发。
        4. 并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行。

1.2 线程基本使用

1.2.1 创建线程的两种方式

在java中线程来使用有两种方法。
        1. 继承Thread类,重写run方法
        2. 实现Runnable接口,重写run方法

1.2.2 线程应用案例1-继承Thread类:

        1) 请编写程序,开启一个线程,该线程每隔1秒。在控制台输出“啪瞄,我是小猫咪
        2) 对上题改进:当输出80次瞄瞄,我是小猫咪,结束该线程
        3) 使用JConsole 监控线程执行情况,并画出程序示意图!

 public class Thread01{
     public static void main(String[]args)throwsInterruptedException{
     //创建Cat对象,可以当做线程使用
        Cat cat = new Cat();
     //源码
    /*
     (1)
      public synchronized void start() {
         start0();
         }
      (2)
         //start0() 是本地方法,是JVM调用, 底层是c/c++实现
        //真正实现多线程的效果, 是start0(), 而不是 run
      private native void start0();
     */

     cat.start(); //启动线程-> 最终会执行 cat 的 run 方法
//cat.run();//run 方法就是一个普通的方法, 没有真正的启动一个线程,就会把run方法执行完毕,才向下执行
//说明: 当main线程启动一个子线程 Thread-0, 主线程不会阻塞, 会继续执行
//这时 主线程和子线程是交替执行..
System.out.println("主线程继续执行" + Thread.currentThread().getName());//名字 main
 for(int i = 0; i < 60; i++) {
     System.out.println("主线程 i=" + i);
     //让主线程休眠
     Thread.sleep(1000);
 } } }
 //说明
    //1. 当一个类继承了 Thread 类,该类就可以当做线程使用
    //2. 我们会重写 run方法,写上自己的业务代码
    //3. run Thread 类 实现了 Runnable 接口的run方法
    /* 
     @Override
     public void run() {
         if (target != null) {
         target.run();
     } }
    */
class Cat extends Thread {
 int times = 0;
 @Override
 public void run() {//重写 run 方法,写上自己的业务逻辑
    while (true) {
     //该线程每隔1秒。在控制台输出 “喵喵, 我是小猫咪”
     System.out.println("喵喵, 我是小猫咪" + (++times) + " 线程名=" +Thread.currentThread().getName());
//让该线程休眠1秒 ctrl+alt+t
 try {
     Thread.sleep(1000);
 } catch (InterruptedException e) {
     e.printStackTrace();
 }
     if(times == 80) {
     break; //当 times 到 80, 退出 while, 这时线程也就退出..
 } } } }

        start() 方法调用start 0()方法后,该线程并不一定会立马执行,只是将线程变成了可运行状态。具体什么时候执行,取决于CPU,由CPU统一调度。

1.2.3 线程应用案例2-实现Runnable接口:

说明:  1. java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。
        2. java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程
案例:
        请编写程序,该程序可以每隔1秒。在控制台输出“hi!”,当输出10次后,自动退出。请使用实现Runnable接口的方式实现。这里底层使用了设计模式[代理模式] => 代码模拟实现Runnable接口开发线程的机制

 public class Thread02{
  public static void main(String[]args){
     Dog dog = new Dog();
     //dog.start();这里不能调用start
     //创建了Thread对象,把dog对象(实现Runnable),放入Thread
     Thread thread = new Thread(dog);
     thread.start();
       //Tiger tiger = new Tiger(); //实现了Runnable
       // ThreadProxy threadProxy = new ThreadProxy(tiger);
       // threadProxy.start();
  } }

 class Animal {
 }
 class Tiger extends Animal implements Runnable {
     @Override
     public void run() {
     System.out.println("老虎嗷嗷叫....");
 } }

 //线程代理类 , 模拟了一个极简的Thread类
 class ThreadProxy implements Runnable {//你可以把 Proxy 类当做 ThreadProxy
     private Runnable target = null;//属性,类型是 Runnable
     @Override
     public void run() {
         if (target != null) {
         target.run(); //动态绑定(运行类型 Tiger)
    } }

public ThreadProxy(Runnable target) {
     this.target = target;
 }
 public void start() {
     start0();//这个方法时真正实现多线程方法
}
 public void start0() {
     run();
 } }
 class Dog implements Runnable { //通过实现 Runnable 接口,开发线程
    int count = 0;
   @Override
   public void run() { //普通方法
    while (true) {
     System.out.println("小狗汪汪叫..hi" + (++count) + Thread.currentThread().getName());
 //休眠1秒
    try {
     Thread.sleep(1000);
    }catch(InterruptedExceptione){
     e.printStackTrace();
     }
     if(count==10){
     break;
 } } } }

1.2.4 线程使用应用案例-多线程执行

        请编写一个程序,创建两个线程,一个线程每隔1秒输出“hello,world”,输出10次,退出,一个线程每隔1秒输出“hi”,输出5次退出. 

 /**
 *@author
*@version1.0
 *main线程启动两个子线程
*/
 public class Thread03{
     public static void main(String[]args){
         T1 t1 = new T1();
        T2 t2 = new T2();
         Thread thread1 = new Thread(t1);
         Thread thread2 = new Thread(t2);
         thread1.start();//启动第 1 个线程
        thread2.start();//启动第 2 个线程
        //...
 } }
 class T1 implements Runnable {
     int count = 0;
     @Override
     public void run() {
         while (true) {
         //每隔1秒输出 “hello,world”,输出10次
    try {
         System.out.println("hello,world " + (++count));
         Thread.sleep(1000);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
         if(count == 60) {
         break;
} } } }
 class T2 implements Runnable {
     int count = 0;
     @Override
     public void run() {
     //每隔1秒输出 “hi”,输出5次
        while (true) {
         System.out.println("hi " + (++count));
     try {
         Thread.sleep(1000);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
         if(count == 50) {
     break;
 } } } }

线程理解:

1.3 继承Thread vs 实现Runnable的区别

1. 从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口
2. 实现Runnable接口方式更加适合多个线程共享一个资源的情况,并且避免了单继承的限制,建议使用Runnable
案例:[售票系统],编程模拟三个售票窗口售票100,分别使用继承 Thread和实现 Runnable方式,并分析有什么问题?

/**
 * @author 
* @version 1.0
 * 使用多线程,模拟三个窗口同时售票100张
*/
 public class SellTicket {
     public static void main(String[] args) {
     //测试
 //SellTicket01 sellTicket01 = new SellTicket01();
 //SellTicket01 sellTicket02 = new SellTicket01();
// SellTicket01 sellTicket03 = new SellTicket01();
 //这里我们会出现超卖..
// sellTicket01.start();//启动售票线程
//sellTicket02.start();//启动售票线程
//sellTicket03.start();//启动售票线程
    System.out.println("===使用实现接口方式来售票=====");
     SellTicket02 sellTicket02 = new SellTicket02();
     new Thread(sellTicket02).start();//第 1 个线程-窗口
    new Thread(sellTicket02).start();//第 2 个线程-窗口
    new Thread(sellTicket02).start();//第 3 个线程-窗口
} }

 //使用Thread 方式
class SellTicket01 extends Thread {
     private static int ticketNum = 100;//让多个线程共享 ticketNum
     @Override
     public void run() {
         while (true) {
         if (ticketNum <= 0) {
     System.out.println("售票结束...");
     break;
     }
     //休眠50毫秒, 模拟
    try {
     Thread.sleep(50);
     } catch (InterruptedException e) {
    e.printStackTrace();
 }
     System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
 + " 剩余票数="+(--ticketNum));
 } } }

 //实现接口方式
    class SellTicket02 implements Runnable {
     private int ticketNum = 100;//让多个线程共享 ticketNum
         @Override
         public void run() {
             while (true) {
             if (ticketNum <= 0) {
         System.out.println("售票结束...");
         break;
 }
 //休眠50毫秒, 模拟
    try {
         Thread.sleep(50);
 } catch (InterruptedException e) {
         e.printStackTrace();
 }
     System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
 + " 剩余票数="+(--ticketNum));//1- 0--1--2
 } } }

1.4 线程终止

1.4.1 说明

1. 当线程完成任务后,会自动退出。
2. 还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式

案例:   需求:启动一个线程t,要求在main线程中去停止线程t,请编程实现.

1.5 线程常用方法

1.5.1 常用方法第一组

1. setName  //设置线程名称,使之与参数 name相同
2. getName //返回该线程的名称
3. start //使该线程开始执行;Java虚拟机底层调用该线程的start0方法
4. run //调用线程对象run方法;
5. setPriority //更改线程的优先级
6. getPriority //获取线程的优先级
7. sleep //在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
8. interrupt //中断线程

注意事项:
1. start底层会创建新的线程,调用run,run 就是一个简单的方法调用,不会启动新线程
2. 线程优先级的范围
3. interrupt,中断线程,但并没有真正的结束线程。所以一般用于中断正在休眠线程
4. sleep:线程的静态方法,使当前线程休眠

1.5.2 常用方法第二组

1. yield:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功
2. join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务
案例: main线程创建一个子线程,每隔1s输出hello,输出20次,主线程每隔1秒,输出hi,输出20次.
要求: 两个线程同时执行,当主线程输出5次后,就让子线程运行完毕,主线程再继续,
 

1.5.3 用户线程和守护线程

1. 用户线程: 也叫工作线程,当线程的任务执行完或通知方式结束
2. 守护线程: 一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束
3. 常见的守护线程: 垃圾回收机制
案例: 如何将一个线程设置成守护线程

1.6 线程的生命周期

1.6.1 JDK 中用Thread.State 枚举表示了线程的几种状态

1.6.2 线程状态转换图

写程序查看线程状态:

public class ThreadState_{
 public static void main(String[]args)throwsInterruptedException{
     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(500);
 }
    System.out.println(t.getName() + " 状态 " + t.getState());
 } }
class T extends Thread {
     @Override
     public void run() {
         while (true) {
         for (int i = 0; i < 10; i++) {
         System.out.println("hi " + i);
         try {
             Thread.sleep(1000);
         } catch (InterruptedException e) {
        }}
      break;
 }}}

1.7 线程的同步

1.7.1 线程同步机制

1. 在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。
2. 也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作.

1.7.2 同步具体方法-Synchronized

3. 如何理解: 就好像某小伙伴上厕所前先把门关上(上锁),完事后再出来(解锁),那么其它小伙伴就可在使用厕所了

1.8 互斥锁

1.8.1 基本介绍

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

案例: 使用互斥锁来解决售票问题

/**
 *@author
*@version1.0
 *使用多线程,模拟三个窗口同时售票100张
*/
 public class SellTicket{
     public static void main(String[]args){
 //测试
// SellTicket01sellTicket01=newSellTicket01();
 // SellTicket01sellTicket02=newSellTicket01();
 // SellTicket01sellTicket03=newSellTicket01();
 // //这里我们会出现超卖..
 // sellTicket01.start();//启动售票线程
//sellTicket02.start();//启动售票线程
//sellTicket03.start();//启动售票线程
//System.out.println("===使用实现接口方式来售票=====");
// SellTicket02 sellTicket02 = new SellTicket02();
// new Thread(sellTicket02).start();//第 1 个线程-窗口
//new Thread(sellTicket02).start();//第 2 个线程-窗口
//new Thread(sellTicket02).start();//第 3 个线程-窗口

//测试一把
SellTicket03 sellTicket03 = new SellTicket03();
 new Thread(sellTicket03).start();//第 1 个线程-窗口
new Thread(sellTicket03).start();//第 2 个线程-窗口
new Thread(sellTicket03).start();//第 3 个线程-窗口
}}

 //实现接口方式, 使用synchronized实现线程同步
class SellTicket03 implements Runnable {
     private int ticketNum = 100;//让多个线程共享 ticketNum
     private boolean loop = true;//控制 run 方法变量
     Object object = new Object();
//同步方法(静态的)的锁为当前类本身
//解读
//1. public synchronized static void m1() {} 锁是加在 SellTicket03.class
 // 2. 如果在静态方法中,实现一个同步代码块.
/*
    synchronized (SellTicket03.class) {
     System.out.println("m2");
     }
 */

 public synchronized static void m1() {
 }

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

 //说明
//1. public synchronized void sell() {} 就是一个同步方法
//2. 这时锁在 this对象
//3. 也可以在代码块上写 synchronize,同步代码块, 互斥锁还是在this对象
public /*synchronized*/ void sell() { //同步方法, 在同一时刻, 只能有一个线程来执行sell方法
    synchronized (/*this*/ object) {
       if (ticketNum <= 0) {
       System.out.println("售票结束...");
     loop = false;
     return;
 }
     //休眠50毫秒, 模拟
    try {
         Thread.sleep(50);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
         System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
 + " 剩余票数="+(--ticketNum));//1- 0--1--2
 } }
     @Override
     public void run() {
     while (loop) {
     sell();//sell 方法是一共同步方法
} }}
     //使用Thread 方式
    // new SellTicket01().start()
     // new SellTicket01().start();
 class SellTicket01 extends Thread {
     private static int ticketNum = 100;//让多个线程共享 ticketNum
// public void m1() {
 //synchronized (this) {
// System.out.println("hello");
// } }
    @Override
     public void run() {
         while (true) {
         if (ticketNum <= 0) {
         System.out.println("售票结束...");
         break;
     }
    //休眠50毫秒, 模拟
    try {
     Thread.sleep(50);
     } catch (InterruptedException e) {
     e.printStackTrace();
     }
     System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
 + " 剩余票数="+(--ticketNum));
     } } }

 //实现接口方式
    class SellTicket02 implements Runnable {
         private int ticketNum = 100;//让多个线程共享 ticketNum
         @Override
         public void run() {
           while (true) {
             if (ticketNum <= 0) {
             System.out.println("售票结束...");
             break;
    }
         //休眠50毫秒, 模拟
    try {
         Thread.sleep(50);
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
         System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
 + " 剩余票数="+(--ticketNum));//1- 0--1--2
     } } }

1.8.2 注意事项

1. 同步方法如果没有使用static修饰:默认锁对象为this
2. 如果方法使用static修饰,默认锁对象:当前类.class
3. 实现的落地步骤:
        需要先分析上锁的代码
        选择同步代码块或同步方法
        要求多个线程的锁对象为同一个即可!

1.9 线程的死锁

1.9.1 基本介绍

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

/**
 *@author
*@version1.0
 *模拟线程死锁
*/
 public class DeadLock_{
     public static void main(String[]args){
 //模拟死锁现象
    DeadLockDemo A = new DeadLockDemo(true);
         A.setName("A线程");
         DeadLockDemo B = new DeadLockDemo(false);
         B.setName("B线程");
         A.start();
         B.start();
 } }
 //线程
class DeadLockDemo extends Thread {
     static Object o1 = new Object();// 保证多线程,共享一个对象,这里使用static
     static Object o2 = new Object();
     boolean flag;
     public DeadLockDemo(boolean flag) {//构造器
        this.flag = flag;
 }
 @Override
     public void run() {
     //下面业务逻辑的分析
    //1. 如果flag 为 T, 线程A 就会先得到/持有 o1 对象锁, 然后尝试去获取 o2 对象锁
    //2. 如果线程A 得不到 o2 对象锁,就会Blocked
    //3. 如果flag 为 F, 线程B 就会先得到/持有 o2 对象锁, 然后尝试去获取 o1 对象锁
     //4. 如果线程B 得不到 o1 对象锁,就会Blocked
 if (flag) {
    synchronized (o1) {//对象互斥锁, 下面就是同步代码
    System.out.println(Thread.currentThread().getName() + " 进入 1");
     synchronized (o2) { // 这里获得 li 对象的监视权
    System.out.println(Thread.currentThread().getName() + " 进入 2");
 } }
 } else {
    synchronized (o2) {
     System.out.println(Thread.currentThread().getName() + " 进入 3");
     synchronized (o1) { // 这里获得 li 对象的监视权
    System.out.println(Thread.currentThread().getName() + " 进入 4");
 } } } } }

1.10 释放锁

1.10.1 下面操作会释放锁

1. 当前线程的同步方法、同步代码块执行结束        案例:上厕所,完事出来
2. 当前线程在同步代码块、同步方法中遇到break、return。        案例:没有正常的完事,经理叫他修改bug,不得已出来
3. 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束案例:没有正常的完事,发现忘带纸,不得已出来
4. 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释
放锁。        案例:没有正常完事,觉得需要酝酿下,所以出来等会再进去

1.10.2 下面操作不会释放锁

1. 线程执行同步代码块或同步方法时,程序调用Thread.sleep(、Thread.yield(方法暂停当前线程的执行,不会释放锁        案例:上厕所,太困了,在坑位上眯了一会
2. 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁。        提示:应尽量避免使用suspend()和resume()来控制线程,方法不再推荐使用

Java 并发编程与多线程 Java 并发编程和多线程是高级开发中的一个重要部分,涉及多线程的创建、线程协同、线程安全、性能优化、并发工具等内容。 阅读详情

相关推荐

Java并发编程:多线程与锁机制

在Java编程中,并发编程是一个重要且复杂的领域。多线程与锁机制是并发编程中的核心概念,它们允许程序同时执行多个任务,提高程序的响应性和效率。然而,不正确的使用多线程和锁机制也可能导致数据不一致、死锁等问题。本文将结合优快云网站上的相关讨论,深入探讨Java并发编程中的多线程与锁机制,通过代码示例和表格分析,提供实用的解决技巧。

shejizuopin的博客 989

Java 知识合集 | 多线程与并发

本篇涵盖了多线程编程中的关键内容,对于理解并发编程的原理和实践有很好的指导作用。继续学习和实践多线程编程将有助于你在并发环境下开发出更稳健、高效的应用程序。

编程洪同学 1024

掌握Java多线程并发编程的艺术:高级模式与最佳实践

在现代软件开发中,随着应用程序复杂度的增加以及硬件资源(如多核CPU)的普及,如何有效地利用多线程来提升程序性能成为了开发者必须面对的问题。Java作为一门支持多线程的强大语言,提供了丰富的API和工具帮助我们构建高效的并发程序。今天,我们将深入探讨Java多线程并发编程中的高级模式与实践,不仅涵盖理论知识,还将通过详细的代码示例展示如何在实际项目中应用这些技术。

墨夶的博客 1746

java并发编程和多线程总结

java并发编程和多线程总结

卓越之识论道,平常之识论事,狭隘之识论人 2064

3D IC中Memory-on-Logic堆叠测试的DFT解决方案与工程实践

在半导体行业,随着摩尔定律逼近物理极限,3D IC技术通过芯片垂直堆叠实现性能提升和异构集成,已成为重要发展方向。其核心原理是利用硅通孔(TSV)或微凸块实现芯片间电气互连,将多个不同功能的芯片(如逻辑芯片与存储芯片)集成在一个封装内。这项技术的核心价值在于能大幅提升系统性能、降低功耗并实现更小的封装尺寸。然而,芯片堆叠后,传统的测试方法面临巨大挑战,尤其是测试访问存在物理屏障,无法直接探测被覆盖的芯片接口。为此,可测试性设计(DFT)成为确保3D IC可靠性与量产可行性的关键技术。它通过在设计阶段植入专用

weixin_42521058的博客 632

Robocorp+Robot Framework学习记录【初学者课程:一级课程】

以下内容均来自:https://robotframework.org/?tab=2#getting-started。通过官网的学习和本地实际安装使用体验而来,本文仅记录学习过程。 Robot Framework介绍 Robot Framework 是一个通用的开源自动化框架。它可用于测试自动化和机器人过程自动化 (RPA)。 Robot Framework环境配置及安装 具体请见:Win10环境下安装pytho、pip与Robot Framework 学习过程与等级划分 官方认为Robot Framew.

OwenDom的博客 5374

Java多线程和并发编程

多进程和多线程简介 多线程实现 多线程创建 多线程信息共享 互斥,一次只有一个线程进去 static共享 public class ThreadDemo0 { public static void main(String [] args) { new TestThread0().start(); new TestThread0().start(); new TestThread0().start(); new TestThread0().start(

zw21sjrc的专栏 377

从0死磕全栈之使用 VS Code 调试 Next.js 应用完整指南

调试目标推荐方式客户端组件VS Code + Chrome 调试器(pwa-chrome中间件(Middleware)同服务端方式静态生成(SSG)逻辑需在next build时调试,建议改用dynamic路由临时测试通过合理配置 VS Code 调试器,你可以像调试普通 Node.js 或前端项目一样,高效排查 Next.js 应用中的各类问题。🐞。

weixin_44058951的博客 1161

Java多线程

多线程 一:程序、进程、线程的基本概念 1.程序(program):就是为了完成特定任务,用某种编程语言编写的一组指令(代码)的集合。即指一段静态的代码。 例如:IDEA程序,一堆文件夹就可以看作是静态的指令 2.进程(process):是程序的一次执行过程,或是正在运行的一个程序。它是一个动态的过程:有着自身的产生、存在和消亡的过程——生命周期。 例如:运行中的PotPlayer、IDEA…… 3.线程(thread):是一个程序内部的一条执行路径。 多线程——若一个进程同一时间并行执行多个线程,就是

weixin_48893653的博客 356

OpenClaw 子代理配对失败问题分析与解决方案

OpenClaw子代理配对失败问题分析与解决方案 问题核心在于agent设备权限不足,仅有operator.approvals权限而缺少operator.admin权限,导致子代理启动时形成权限死锁。本文提供三种解决方案: 直接编辑设备配对文件(推荐):修改本地JSON文件,为agent设备添加完整operator.admin权限,操作简单快捷。 标准重新配对流程:删除现有agent设备后重新配对,通过正常审批流程获取完整权限,符合系统安全设计。 修改源码降低权限要求(仅限开发环境):调整子代理代码避免强制

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 149

使用Open3D进行RGB-D图像点云处理

在本文中,我们将使用Open3D来处理RGB-D图像,提取点云并进行一些基本的操作。总结起来,本文介绍了如何使用Open3D库处理RGB-D图像并提取点云。我们展示了如何读取RGB-D图像,创建RGB-D图像和点云,并显示点云。除了显示点云,Open3D还提供了许多其他功能,如点云滤波、点云配准、表面重建等。在创建RGB-D图像时,我们需要指定深度图像的缩放因子和截断值,以及是否将RGB图像转换为强度图像。希望本文能够帮助您入门Open3D,并在处理RGB-D图像和点云数据时提供一些指导。

QfcaLinux的博客 445

Java入门至精通:多线程与并发编程

在Java中,线程(Thread)是程序执行流的最小单元,代表着程序中的单一顺序控制流程。一个Java应用程序通常由一个或多个线程组成,这些线程可以并发地执行,从而实现多任务并行处理,提高程序的执行效率和响应速度。

m0_61635718的博客 1175

室内无线传播损耗分析与传播模型验证课程设计

室内无线传播损耗分析与传播模型验证课程设计

a_zxswer的博客 187

Java多线程并发编程技术详解

Java多线程并发编程是一项需要深入理解和熟练掌握的技术,只有合理地设计和使用多线程,才能真正发挥其在提升系统性能方面的巨大潜力。随着对Java并发机制及工具类库的深入学习和应用,开发者可以更好地构建高效、稳定的并发系统。

聚焦于深度解析最新的编程语言特性、框架升级、架构设计、开发工具和最佳实践,涵盖Web前端(如Vue3, React, Angular等)、后端开发(如Node.js, Java, Python等)、移动端开发(iOS, Android原生及跨平台开发) 3万+

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

Robot_PLC_HMI_Automation 3575

文献综述三大痛点用AI轻松解决!借助Gemini 3 Pro搞定检索难、阅读慢、框架乱问题(附 AI 提示词)

4)“漏斗式”结构:先介绍宏观领域的研究现状,再缩小范围,聚焦于与你课题直接先关的子领域,深入探讨与你研究变量直接相关的文献, 指出前人没做过、没做全或结论有矛盾的地方,再顺势提出你的研究课题,这种结构逻辑最清晰,能直接引导读者发现你研究的必要性。想要有针对性的搜到相关文献,必须先把模糊的研究题目拆解成精准的检索语言,这个时候就需要建立一个关键词矩阵,如核心词、同义词、学术术语、上下位词,以及对应的英文表达。请围绕【我的研究主题/关键词】,检索近5年发表的高被引的中英文文献,优先选择顶刊综述/论文。

智能AI让学术科研更容易 277

关于 java:7. 多线程与并发编程

System.out.println("守护线程");});// 设置为守护线程(主线程退出,它也退出)// 设置线程名称,方便调试和逆向时识别t.start();是一个函数式接口,可用 lambda 表达式实现;call()方法执行任务逻辑并返回一个结果;可以抛出受检异常(Exception。

Triste__chengxi的博客 1583

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

如何理解应用 Java 多线程与并发编程?

多线程(Multithreading)是指在一个进程内同时运行多个线程,每个线程执行一段独立的代码片段。每个线程都有自己的任务,并且可以共享同一个内存空间。对于现代计算机来说,多线程可以提升程序的执行效率,尤其在处理大规模计算或 I/O 操作时,多线程能够有效减少程序的等待时间。在 Java 中,线程可以通过继承Thread类或实现Runnable接口来创建。并发编程(Concurrency Programming)是指在程序中同时处理多个任务的能力。

龚小帅的博客 1298

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java并发编程——多线程

本章主要介绍java中多线程并发编程基础知识,包括的内容有: 进程,线程,协程的区别 多线程的实现方式 线程中断和优先级 线程状态的切换 一、进程、线程和协程 1.1 进程、线程和协程 进程是资源分配的最小单位,操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源)。进程拥有自己独立的堆和栈,既不共享堆,也不共享栈。 线程是CPU调度的最小单位,线程有自己的堆栈和局部变量,...

西木风落 1020

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

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

Java中的多线程与并发编程

Java中的多线程与并发编程大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下Java中的多线程与并发编程。多线程编程可以充分利用CPU资源,提高程序的运行效率。然而,由于多线程编程的复杂性,开发过程中需要特别注意线程安全和死锁等问题。本文将介绍Java多线程的基本概念、线程的...

weixin_40942424的博客 177

Java 并发编程之一——天生的多线程语言

Java 是一门支持并发编程的语言,它通过提供内置的多线程支持使得程序能够执行多任务并且提高效率。在一个简单的 Java 程序中,就算是最基本的main函数运行时,实际上也会有多个系统级别的线程同时运行,提供不同的服务。执行结果显示了除了主线程 (main) 之外,还有一些如垃圾回收器的辅助线程 (Finalizer),信号分发线程 ()等,这些线程都是 Java 虚拟机为了优化执行和管理工作而自动创建的。

君若雅的博客 1169

Java 多线程并发编程

与进程相比,线程更“轻量”,共享所属进程的资源(如内存空间、文件描述符等),减少了创建与切换成本。在经典生产者 - 消费者场景,生产者生产物品放入共享缓冲区,消费者从缓冲区取物品消费,需协调二者速度避免缓冲区溢出或空等情况。对象锁定代码块,功能类似,却能更灵活把控同步范围,降低锁粒度,减少不必要阻塞,提升并发效率。频繁创建、销毁线程开销大,线程池可统一管理线程,复用已有线程执行任务,提升系统性能与稳定性。创建固定 3 个线程的线程池,循环提交 10 个任务,线程池自动调度线程执行,任务结束可调用。

leo__520的博客 717

Java多线程与并发编程全面解析-高效任务调度与优化策略

多线程是指在单个程序中同时运行多个线程,每个线程都可以独立完成特定的任务。Java通过Thread类和Runnable接口提供了多线程的基本实现。Java中的多线程和并发编程是现代应用开发中非常重要的一部分,它们能够显著提升系统的响应能力和处理能力。然而,要实现高效的并发编程并非易事,需要开发者在任务调度、资源管理和并发控制方面进行深入设计。任务调度策略:通过优先级调度、固定时间间隔调度和延迟调度等策略,开发者可以更灵活地控制多线程任务的执行,确保重要任务的及时处理,并提高系统的吞吐量和响应速度。

一键难忘的博客 3119

Java并发编程与多线程详解

Java并发编程是充分利用多核CPU、构建高性能应用的核心技术。从基础的Thread和Runnable,到保证线程安全的和Lock,再到强大的JUC工具包(线程池、等),Java提供了丰富的并发编程组件。​​核心思想​​:在保证​​线程安全​​(数据正确性)的前提下,尽可能提高程序的​​性能​​和​​响应能力​​。

m0_74463556的博客 1376
上一篇: Java文件与IO操作
下一篇: 网络编程基础
知昂可
博客等级 码龄6年 1032粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值