Java 进阶:多线程1

java连接sqlserver数据库教程,Java-进阶:多线程1 我们可以通过。 阅读详情

目录
一、概述
二、Thread 类
三、创建线程:继承 Thread 类
四、创建线程:实现 Runnable 接口
五、线程优先级
六、线程的生命周期
七、同步代码块


一、概述

1. 进程和线程

  • 进程:进程指正在运行的程序。
  • 线程:线程是进程中的一个执行单元,是程序 使用cpu 的基本单位(调度)。负责当前进程中程序的执行。是进程中单个顺序控制流(执行路径),是一条单独执行的路径
  • 一个程序运行后至少有一个进程,一个进程中可以包含多个线程
  • 在操作系统中,进程是资源分配的基本单位,线程是调度的基本单位。

在没有出现线程之前,进程既是操作系统进行资源分配的基本单位,又是调度的基本单位

  • 单线程程序:若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。程序只有一条执行路径
  • 多线程程序:若有多个任务可以同时执行。程序有多条执行路径

操作系统发展:单道批处理操作——>多道批处理操作系统——>分时操作系统(多进程的)——>线程 
批处理:程序在执行过程中,不会响应用户的请求 
单道批处理操作:一次只能运行一个程序,如果要在计算机运行多个程序,这多个程序,只能一个一个的顺序执行,如果这个正在运行的程序,在运行过程中,执行了一些非常耗时的IO操作(传输数据的过程是没有使用到cpu),这样一来,cpu就闲下来了,但是cpu是计算机中,最为昂贵的 
多道批处理操作系统:同时运行多个程序,显著的提高了cpu的利用率,但是我们一旦一个,程序运行起来,都是是需要使用计算机资源的 
分时操作系统:每一个进程,有一个固定的时间片,在运行一个固定的时间片后,紧接着轮到下一个进程运行(切换)

  • 为什么还会有线程呢? 进程切换的代价太高了,这样一来,每一次进程切换,都需要付出不小的额外的代价,为了减小进程切换的代价,引入了线程,提高CPU的利用率

2. 线程调度

  • 分时调度:所有线程 轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
  • 抢占式调度:优先让 优先级高的 线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度
  • 体现了:程序运行的不确定性

1. CPU 使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。
2. 多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。

3. 线程控制

  • 线程睡眠static void sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
//让主线程,休眠3秒
Thread.sleep(3000);
//sleep新的写法
TimeUnit.SECONDS.sleep(3);
System.out.println("睡醒了");
  • 线程加入public final void join():(让当前线程)等待该线程(新加入的线程终止)终止。
SecondThread sec = new SecondThread("zs");
SecondThread thr = new SecondThread("lsii");
SecondThread fou = new SecondThread("wangwu");

//启动这三个线程对象
sec.start();
//sec线程上调用join方法 ,让当前线程(main)等待sec线程执行完毕
sec.join();
thr.start();
fou.start();
  • 线程礼让public static void yield():暂停当前正在执行的线程对象,并执行其他线程

只是让当前线程放弃cpu执行权,但是不能阻止它放弃后继续抢夺cpu执行权

  • 后台线程(守护线程)public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出;该方法必须在启动线程前调用。
SecondThread sec = new SecondThread("zs");
SecondThread thr = new SecondThread("lsii");
//将sec和thr线程设置为守护线程
sec.setDaemon(true);
thr.setDaemon(true);
//启动
sec.start();
thr.start();
//之后发现sec和thr是守护线程,就会中断
  • 中断线程:public void interrupt():让一个线程控制另外一个线程(有条件的:受阻),可以利用该方法终止另一个线程的运行

1. 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 等阻塞方法处于阻塞状态,它还将收到一个 InterruptedException
2. 中断一个不处于活动状态的线程不需要任何作用。 
中断一个不处于阻塞状态的线程,没有其他任何效果

public class Test {
    public static void main(String[] args) {
        FiveThread fiveThread = new FiveThread();
        fiveThread.start();
        //在主线程中,终止fiveThread,休眠状态
        fiveThread.interrupt();
    }
}

// 睡5秒之后,再让该线程输出一句话
class FiveThread extends Thread{
    @Override
    public void run() {
        try {
            //假如申请了很多的系统资源
            TimeUnit.SECONDS.sleep(5);
            System.out.println("FiveThread 睡醒了");
        } catch (InterruptedException e) {
            e.printStackTrace();
            //异常的意义:即使我的线程被异常终止,我也可以保证资源的正常释放
        }
    }
}

//会抛出 java.lang.InterruptedException: sleep interrupted

4. JAVA程序的运行原理

  • Java命令会启动 JVM,即启动了一个进程,该进程会启动一个主线程,然后主线程调用某个类的 main方法,所以 main方法 都是运行在主线程里
  • jvm 启动后,必然有一个执行路径(线程)从 main方法开始的,一直执行到 main方法结束,这个线程在Java中称之为主线程。
  • 当程序的主线程执行时,如果遇到了循环而导致程序在指定位置停留时间过长,则无法马上执行下面的程序,需要等待循环结束后能够执行
  • 方法在哪个线程中被调用,它就运行在哪个线程中
  • JVM 是一个多线程程序,每个Java 进程都分配一个 JVM 实例
public class ThreadDemo {
    public static void main(String[] args) {
        //利用垃圾回收器来证明
        while(true) {
            //这里虽然一直在堆空间中,创建数组对象,
            // 但是始终没有耗尽堆空间,就是因为垃圾回收器,
            // 在另外一个线程中,帮我们回收垃圾,所以才不会耗尽heap内存
            // 从而证明,jvm是线程的
            int[] ints = new int[1024];
            ints = null;
        }
    }
}

二、Thread 类

1. 概述

  • Thread是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程
  • 不是抽象类

2. 构造方法

  • Thread(): 分配新的 Thread 对象
  • Thread(String name):分配新的 Thread 对象,将指定的 name 作为其线程名称

3. 常用方法

  • void start():使该线程开始执行,Java虚拟机调用线程的 run 方法
  • void run():该线程要执行的操作,
  • static void sleep(long millis):在指定毫秒内让当前正在执行的线程休眠,暂停执行
  • static Thread currentThread():返回当前正在执行的线程对象的引用Thread.currentThread()

4. 创建新执行线程的两种方法

  • 将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。
  • 声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建 Runnable 的子类对象,传入到某个线程的构造方法中,开启线程。

虽然实现线程有两种方式,其实从客观来讲,线程本身只代表独立的执行路径, 执行的具体内容其实是Task本身,和执行路径的实现本身没有联系;只是我们开发者,想将一个task放在某条独立的执行路径(Thread 类对象,也就是一个线程中)来运行


三、创建线程:继承 Thread 类

  • 创建线程的步骤

  • 定义一个类继承 Thread

  • 重写 run方法

  • 创建子类对象,就是创建线程对象

  • 调用 start 方法,开启线程并让线程执行,同时还会告诉jvm去调用 run 方法

线程对象调用 run方法 不开启线程。仅是对象调用方法。 
线程对象调用 start 开启线程,并让 jvm 调用 run 方法在开启的线程中执行

//测试类
public class Test {
    public static void main(String[] args) {
        //创建自定义线程对象
        MyThread mt = new MyThread("新的线程!");

        //错误启动线程,这只是普通的方法调用
        //firstThread.run();

        //开启新线程
        mt.start();

        //再次启动一个线程,会抛异常IllegalThreadStateException 
        //因为一个线程对象只能启动一次,
        // 如果同一个线程对象,启动多次,就会抛出异常
        //firstThread.start();
        //只能创建一个新的对象
        new MyThread("第二个线程!").start();
        //获取主线程的名字
        System.out.println(Thread.currentThread().getName()+":主线程!");
    }
}

//自定义线程
class MyThread extends Thread {
    //定义指定线程名称的构造方法
    public MyThread(String name) {
        //调用父类的String参数的构造方法,指定线程的名称
        super(name);
    }

    //重写run方法,完成该线程执行的逻辑
    @Override
    public void run() {
        //获取线程的名字getName()
        System.out.println(getName() + ":正在执行!");
    }
}

四、创建线程:实现 Runnable 接口

1. Runnable 接口的构造方法

  • Thread(Runnable target): 分配新的 Thread 对象,以便将 target 作为其运行对象
  • Thread(Runnable target,String name) : 分配新的 Thread 对象,以便将 target 作为其运行对象;并将指定的 name 作为其名称

2. 创建线程的步骤

  • 定义类实现 Runnable 接口。
  • 覆盖接口中的 run方法
  • 创建 Thread类的 对象
  • 将 Runnable接口 的子类对象作为参数传递给 Thread 类 的构造方法。
  • 调用 Thread类的 start() 开启线程。

Thread 类的构造函数:
1. Thread(): 分配新的 Thread 对象
2. Thread(String name):分配新的 Thread 对象,将指定的 name 作为其线程名称

//测试类
public class Test {
    public static void main(String[] args) {
        //创建实现 Runnable 接口的子类对象
        MyRunnable myrunnable = new MyRunnable();
        //创建Thread实例,在Thread的构造方法中传递Runnable实例
        //Runnable就代表在 Thread 上运行的任务
        Thread thread = new Thread(myrunnable);
        //开启线程
        thread.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("main线程:正在执行!"+i);
        }
    }
}

//自定义线程执行任务类
class MyRunnable implements Runnable{
    //定义线程要执行的run方法逻辑
    //run方法,不能抛出编译时异常
    //run方法,没有参数没有返回值
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("我的线程:正在执行!"+i);
        }
    }
}

3. 实现 Runnable 接口的原理

为什么需要定一个类去实现Runnable接口呢?继承Thread类和实现Runnable接口有啥区别呢? 
只有创建Thread类的对象才可以创建线程。线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务

4. 两种方式的比较

  • 继承 Thread 类方式

  • 如果某个类已经有父类,则无法再继承 Thread 类

  • 实现 Runnable 接口方式

  • 解决了方式一的单继承的局限性

  • 还有一个优点,便于多线程共享数据

第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象;线程分为两部分,一部分线程对象,一部分线程任务。

  • 继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。
  • 实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦

五、线程优先级

1. 概述

  • 我们可以通过 Thread 类中:

  • getPriority 方法 :获取 线程的优先级

  • setPriority 方法 :设置 线程的优先级

2. 线程优先级的范围

  • 如果设置线程优先级的范围,超出了规定范围,会抛出异常;

MAX_PRIORITY 10 //最大优先级 
MIN_PRIORITY 1 //最小优先级 
NORM_PRIORITY 5 //默认优先级

//使用
thread1.setPriority(Thread.MAX_PRIORITY); //设置
thread2.setPriority(Thread.MIN_PRIORITY);
System.out.println(thread1.getPriority());//获取

3. 注意!

  • 对于 TThread 类中的优先级,对于jvm而言,不起决定性作用!

也就是说 jvm 在实际调度线程的时候,它使用的优先级可能不仅仅包含我们给每个线程所设置的静态优先级,可能还考虑了其他的很多因素(各个线程的运行状态),所以我们所设置的优先级对于 jvm 只起一个参考作用


六、线程的生命周期

1. 新建状态

  • 创建线程对象

2. 就绪状态

  • žstart() 之后
  • sleep() 睡醒之后
  • yield() 之后
  • 有执行资格,等待cpu调度

3. 运行状态

  • 取得执行权,开始执行

4. 阻塞状态

  • 无执行资格,无执行权

5. 死亡状态

  • 执行完毕,等待垃圾回收

线程的生命周期


七、同步代码块

1. 问题引入——线程安全问题

  • 发生线程安全问题的三个条件:

1. 多线程运行环境
2. 多线程访问线程共享数据(存在共享数据)
3. 访问共享数据的操作不是原子操作。 
注:原子操作:不可分割的操作 ,相当于一次性完成的操作

  • 当这三个条件同时满足的时候,才会发生多线程的数据安全问题
  • 解决多线程的线程安全问题:如何实现线程对共享资源的排他性访问(只有我访问完了你们才能修改)?
  • 使用 同步代码块

2. 同步代码块

  • 同步代码块实现 线程同步
  • 线程同步:就是利用锁对象,完成多线程运行环境中,对共享资源的排他性访问(我走你不能走, 你走我不能走)
  • 优点:解决了多线程的安全问题
  • 缺点:消耗资源(当线程很多时,每个线程运行的时候都需要去判断同步锁,这个是很耗费系统资源的)

线程异步:线程之间,互不干扰,各自独立运行(我走我的,你走你的)

  • 格式:
synchronized(对象){
    //critical section
        对共享资源的访问的代码
}

1. 同步代码块中所使用的对象,称之为锁对象 ——> 锁的角色 
锁对象中,有一个标志位:可以表示两种状态,加锁 和 解锁
2. 持有锁的是线程(一个线程给一个锁对象加锁,我们就说这个线程持有了锁对象)
3. 同步代码块何时给锁对象加锁?进入同步代码块的同时,就给锁对象加锁
4. 线程何时释放持有的锁? 当执行完同步代码块的时候,就会释放同步代码块的锁对象
5. 判断和修改锁对象
标志位
的操作,这是由 jvm 保证一定是原子操作 
6.** 锁对象,究竟是什么对象**? java语言中任意一个对象,都可以充当锁对象的角色(因为任意一个对象中都有一个表示加锁,解锁状态的标志位)

  • 注意点:

虽然锁对象可以是任意对象,但是针对同一个(同样的多个共享变量) 的所有操作,都必须保证在同步代码块中,使用同一个锁对象,才能避免线程安全问题。

3. 同步方法

  • 当同步代码块的范围扩大到整个方法的方法体的时候,我们可以将整个方法定义成同步方法,在方法声明上加上synchronized
  • 普通的同步代码块: synchronized(锁对象) {}
  • 同步方法: void synchronized 方法名(){}
  • 同步方法的锁对象就是 this

静态方法是否可以定义为同步方法? 
静态的同步方法, 在方法声明上加上static synchronized 
它的所使用的锁对象是:当前类的字节码文件对象:类名.class

26、JAVA进阶——多线程 一、认识进程和线程 | 1. 进程 | 2. 线程 | 3. 多线程的优势 | 二、编写线程类 | 三、线程状态和线程调度 | 1.线程的状态 | 2.线程调度 阅读详情

相关推荐

Windows域账户无管理员权限也能装软件?3步搞定UAC设置(附安全提醒)

本文探讨了在Windows域环境中,如何通过配置用户账户控制(UAC)实现临时提权,让无管理员权限的域账户也能安装软件。文章详细介绍了三步走策略:临时加入本地管理员组、调整UAC行为以及至关重要的权限回收,并提供了脚本化部署方案与安全实践指南,旨在平衡企业IT管理的效率与安全。

fox11的博客 760

java多线程

 多线程介绍   了解多线程的概念:   进程:进程是指在运行的程序。准确的来说当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。   线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称 之为多线程程序。简而言之:一个程序运行后至少有一个进程,一个进程中可以包

夜半时分看世界 293

全本地AI代理实战:零数据外泄的本地化Agent工作流搭建

全本地AI代理是一种将大语言模型推理、长期记忆与工具调用完全运行于用户本地设备的智能体架构,其核心原理在于通过进程隔离与标准化协议实现模型层、记忆层和工具层的解耦协同。相比依赖云端API的传统方案,它在数据主权、响应确定性与环境复现性上具备不可替代的技术价值。典型应用场景包括法务合规文档处理、离线工业现场辅助决策、以及高敏感度企业知识管理。本文聚焦Qwen2+Ollama+SurrealDB+Agno技术栈,详解如何构建可落地的全本地AI代理系统,覆盖从硬件适配、向量记忆建模到多模态插件协同的完整链路。

weixin_34194964的博客 650

Java同时处理多个数据的方法详解

Java同时处理多个数据的三种常用方法详解。

m0_72958694的博客 1954

ROS 2 Jazzy与Gazebo Harmonic仿真实战:从零搭建机器人仿真环境与高级应用

本文详细介绍了如何使用ROS 2 Jazzy和Gazebo Harmonic从零搭建机器人仿真环境,涵盖环境配置、传感器集成、多机器人协同和GPU加速优化等高级应用。通过实战案例和性能调优技巧,帮助开发者高效构建可靠的机器人仿真系统,提升开发效率。

h9j8k7l6m5n的博客 1220

相机标定原理与张氏标定法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

heeweii的博客 2281

Java多线程的五种实现方式

Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 一、第一种方式:继承Thread类 万物皆对象,那么线程也是对象,对象就应该能够抽取其公共特性封装成为类,使用类可以实例化多个对象,那么实现线程的第一种方式就是继...

riemann_的博客 1611

安卓中蓝牙免提HFP的一些分析

最近看了一些大牛的博客,无不提到了技术分享的重要性,的确,分享自己的知识不仅仅是与他人讨论并相互提高的过程,更是对自己知识的梳理。希望自己能以此为契机,形成周期性博客分享的习惯。 文章标题为HFP的一些分析,HFP(Hand Free Profile)主要定义了安卓中与接打电话相关的一些功能的实现。本文主要介绍这其中对于HFP非常重要的Service Level Connection的建立。首先...

底层码农 772

JAVA理论(二)JAVA多线程实现同步+多线程并发同步解决方案

一、线程安全问题 1、为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作时不会发生数据冲突问题。 2、案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 1)改良前代码 /** * 需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 * Created by yz on 2018/04/01. */ public class ThreadDe

sheep8521的博客 745

推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展

推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。

丨汀、的博客 7596

【入门AUTOSAR网络管理测试】RSS-PBM状态转换

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中RSS-PBM状态转换如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 872

java的接口的应用

接口,java的基础

zhangxiaohuas的博客 2663

基于Python的MOOC课程评价爬取与分析系统设计与实现

本文详细介绍了如何使用Python最新技术栈构建一个高效的MOOC课程评价爬取与分析系统。系统采用Scrapy框架结合Selenium实现动态页面抓取,利用PyMySQL进行数据存储,并通过Pandas和Matplotlib实现数据可视化分析。文章从爬虫原理、技术选型、系统设计到代码实现进行全面讲解,为教育工作者改进教学质量提供数据支持。关键词:Python爬虫、MOOC评价分析、Scrapy框架、数据可视化、教学改进。

2201_76125261的博客 1103

Java-进阶:多线程1

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。sleep() 睡醒之后yield() 之后有执行资格,等待cpu调度3. 运行状态取得执行权,开始执行面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。

2401_85379532的博客 1099

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java-进阶:多线程1(1)

System.out.println(“睡醒了”);//启动这三个线程对象//sec线程上调用join方法 ,让当前线程(main)等待sec线程执行完毕sec.join();只是让当前线程放弃cpu执行权,但是它放弃后继续抢夺cpu执行权//将sec和thr线程设置为守护线程//启动//之后发现sec和thr是守护线程,就会中断。

2401_84103216的博客 726

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JAVA进阶学习笔记(1):多线程

1 基本概念 1.1 程序 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 1.2 进程 进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态 的过程:有它自身的产生、存在和消亡的过程。——生命周期 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域 。 1.3 线程 线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。 1.若一个进程同一时间并行执行多个线程,就是支持多线程的 2.线程

LeavingBook的博客 900

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java进阶:15.1 多线程 - Thread、Executor

1. 进程、线程概念 首先要理解进程(Processor)和线程(Thread)的区别: 进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。 线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。 一个线程只能属于一个进程,但是一个进程可以拥有多个线...

桃子味的梨 945

Java-进阶:多线程1(2)

1. 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 等阻塞方法处于阻塞状态,它还将收到一个 InterruptedException。虽然实现线程有两种方式,其实从客观来讲,线程本身只代表独立的执行路径, 执行的具体内容其实是Task本身,和执行路径的实现本身没有联系;

2401_84103216的博客 920

Java进阶(一)多线程1:创建方式及常用方法

1.概述:程序、进程、线程 程序program 是为了完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程process 是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程(生命周期)。 例如:运行中的QQ 程序是静态的,进程是动态的。 进程作为资源分配的单位,系统运行时会为每一个进程分配不同的内存区域。 线程thread 进程可进一步细化为线程,是一个程序内...

qq_33491651的博客 813

java 多线程 thread insert_Java 进阶:多线程1(线程的生命周期、Thread 类)

目录一、概述二、Thread 类三、创建线程:继承 Thread 类四、创建线程:实现 Runnable 接口五、线程优先级六、线程的生命周期七、同步代码块一、概述1. 进程和线程进程:进程指正在运行的程序。线程:线程是进程中的一个执行单元,是程序 使用cpu 的基本单位(调度)。负责当前进程中程序的执行。是进程中单个顺序控制流(执行路径),是一条单独执行的路径一个程序运行后至少有一个进程,一个进...

weixin_42309722的博客 622

启动多个java进程则对应多个虚拟机_Java 进阶:多线程1

目录一、概述二、Thread 类三、创建线程:继承 Thread 类四、创建线程:实现 Runnable 接口五、线程优先级六、线程的生命周期七、同步代码块一、概述1. 进程和线程进程:进程指正在运行的程序。线程:线程是进程中的一个执行单元,是程序 使用cpu 的基本单位(调度)。负责当前进程中程序的执行。是进程中单个顺序控制流(执行路径),是一条单独执行的路径一个程序运行后至少有一个进程,一个进...

weixin_39885383的博客 547

Java进阶12 多线程

线程、进程、开启线程的三种方式、线程安全和同步、线程通信、生产者消费者模式

summer_9823的博客 1237

Java多线程进阶详解

使用CAS编写代码,比较然后交换。大部分没问题,但在极端情况下有问题。比如银行取钱一个人账户是1000,取款500,假设是按照CAS的方式来执行的。按取款卡了一下,又按了一下。就有两个线程来进行操作,如果恰好有人转账500,则会出现bug。如何处理ABA问题呢?使用账户余额判定,本身就不科学。属于能加也能减。引入一个只能加的版本号,每次取钱或者存钱,版本号就+1,就可以进一步解决ABA问题。CAS的核心就在于说,通过数值没变=》中间没有别的线程覆盖。

2302_80113478的博客 1149

Java多线程之进阶篇

ThreadPoolExecutor是线程池类。对于线程池,可以通俗的将它理解为“存放一定数量的一个线程集合。线程池允许若个线程同时运行,运行同时运行的线程数量就是线程池的容量。当添加到线程池中的线程超过它的容量时,会有一部分线程阻塞等待,线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理。(2)

weixin_48374562的博客 969
上一篇: Java 进阶:集合框架3
下一篇: Java 进阶:多线程2
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值