多线程知识代码总结

Ubuntu20.04安装Ceres库 ceres真难安装。 阅读详情

一:实现线程的三种方式

1丶实现线程的第一种方式

实现线程的第一种方式:
    编写一个类,直接继承java.lang.Thread,重写run方法。

    怎么创建线程对象? new就行了。
    怎么启动线程呢? 调用线程对象的start()方法。

注意:
    亘古不变的道理:
        方法体当中的代码永远都是自上而下的顺序依次逐行执行的。

以下程序的输出结果有这样的特点:
    有先有后。
    有多有少。
    这是咋回事?这里画一个问号???????????????????????

 public static void main(String[] args) {
        // 这里是main方法,这里的代码属于主线程,在主栈中运行。
        // 新建一个分支线程对象
        MyThread t = new MyThread();
        // 启动线程
        //t.run(); // 不会启动线程,不会分配新的分支栈。(这种方式就是单线程。)
        // start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了。
        // 这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来,start()方法就结束了。线程就启动成功了。
        // 启动成功的线程会自动调用run方法,并且run方法在分支栈的栈底部(压栈)。
        // run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级的。
        t.start();
        // 这里的代码还是运行在主线程中。
        for(int i = 0; i < 1000; i++){
            System.out.println("主线程--->" + i);
        }
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        // 编写程序,这段程序运行在分支线程中(分支栈)。
        for(int i = 0; i < 1000; i++){
            System.out.println("分支线程--->" + i);
        }
    }
}

2丶实现线程的第二种方式,编写一个类实现java.lang.Runnable接口。

public static void main(String[] args) {
        // 创建一个可运行的对象
        //MyRunnable r = new MyRunnable();
        // 将可运行的对象封装成一个线程对象
        //Thread t = new Thread(r);
        Thread t = new Thread(new MyRunnable()); // 合并代码
        // 启动线程
        t.start();

        for(int i = 0; i < 100; i++){
            System.out.println("主线程--->" + i);
        }
    }
}

// 这并不是一个线程类,是一个可运行的类。它还不是一个线程。
class MyRunnable implements Runnable {

    @Override
    public void run() {
        for(int i = 0; i < 100; i++){
            System.out.println("分支线程--->" + i);
        }
    }
}

3丶实现线程的第三种方式:实现Callable接口

    这种方式的优点:可以获取到线程的执行结果。
    这种方式的缺点:效率比较低,在获取t线程执行结果的时候,当前线程受阻塞,效率较低。

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

        // 第一步:创建一个“未来任务类”对象。
        // 参数非常重要,需要给一个Callable接口实现类对象。
        FutureTask task = new FutureTask(new Callable() {
            @Override
            public Object call() throws Exception { // call()方法就相当于run方法。只不过这个有返回值
                // 线程执行一个任务,执行之后可能会有一个执行结果
                // 模拟执行
                System.out.println("call method begin");
                Thread.sleep(1000 * 10);
                System.out.println("call method end!");
                int a = 100;
                int b = 200;
                return a + b; //自动装箱(300结果变成Integer)
            }
        });

        // 创建线程对象
        Thread t = new Thread(task);

        // 启动线程
        t.start();

        // 这里是main方法,这是在主线程中。
        // 在主线程中,怎么获取t线程的返回结果?
        // get()方法的执行会导致“当前线程阻塞”
        Object obj = task.get();
        System.out.println("线程执行结果:" + obj);

        // main方法这里的程序要想执行必须等待get()方法的结束
        // 而get()方法可能需要很久。因为get()方法是为了拿另一个线程的执行结果
        // 另一个线程执行是需要时间的。
        System.out.println("hello world!");
    }
}

二:使用定时器指定定时任务。 

public class TimerTest {
    public static void main(String[] args) throws Exception {

        // 创建定时器对象
        Timer timer = new Timer();
        //Timer timer = new Timer(true); //守护线程的方式

        // 指定定时任务
        //timer.schedule(定时任务, 第一次执行时间, 间隔多久执行一次);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date firstTime = sdf.parse("2020-03-14 09:34:30");
        //timer.schedule(new LogTimerTask() , firstTime, 1000 * 10);
        // 每年执行一次。
        //timer.schedule(new LogTimerTask() , firstTime, 1000 * 60 * 60 * 24 * 365);

        //匿名内部类方式
        timer.schedule(new TimerTask(){
            @Override
            public void run() {
                // code....
            }
        } , firstTime, 1000 * 10);

    }
}

// 编写一个定时任务类
// 假设这是一个记录日志的定时任务
class LogTimerTask extends TimerTask {

    @Override
    public void run() {
        // 编写你需要执行的任务就行了。
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strTime = sdf.format(new Date());
        System.out.println(strTime + ":成功完成了一次数据备份!");
    }
}

三:守护线程

  public static void main(String[] args) {
        Thread t = new BakDataThread();
        t.setName("备份数据的线程");

        // 启动线程之前,将线程设置为守护线程
        t.setDaemon(true);

        t.start();

        // 主线程:主线程是用户线程
        for(int i = 0; i < 10; i++){
            System.out.println(Thread.currentThread().getName() + "--->" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class BakDataThread extends Thread {
    public void run(){
        int i = 0;
        // 即使是死循环,但由于该线程是守护者,当用户线程结束,守护线程自动终止。
        while(true){
            System.out.println(Thread.currentThread().getName() + "--->" + (++i));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

四 :生产者和消费者模式

1、使用wait方法和notify方法实现“生产者和消费者模式”

2、什么是“生产者和消费者模式”?
    生产线程负责生产,消费线程负责消费。
    生产线程和消费线程要达到均衡。
    这是一种特殊的业务需求,在这种特殊的情况下需要使用wait方法和notify方法。

3、wait和notify方法不是线程对象的方法,是普通java对象都有的方法。

4、wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。

5、wait方法作用:o.wait()让正在o对象上活动的线程t进入等待状态,并且释放掉t线程之前占有的o对象的锁。

6、notify方法作用:o.notify()让正在o对象上等待的线程唤醒,只是通知,不会释放o对象上之前占有的锁。

7、模拟这样一个需求:
    仓库我们采用List集合。
    List集合中假设只能存储1个元素。
    1个元素就表示仓库满了。
    如果List集合中元素个数是0,就表示仓库空了。
    保证List集合中永远都是最多存储1个元素。

    必须做到这种效果:生产1个消费1个。

 public static void main(String[] args) {
        // 创建1个仓库对象,共享的。
        List list = new ArrayList();
        // 创建两个线程对象
        // 生产者线程
        Thread t1 = new Thread(new Producer(list));
        // 消费者线程
        Thread t2 = new Thread(new Consumer(list));

        t1.setName("生产者线程");
        t2.setName("消费者线程");

        t1.start();
        t2.start();
    }
}

// 生产线程
class Producer implements Runnable {
    // 仓库
    private List list;

    public Producer(List list) {
        this.list = list;
    }
    @Override
    public void run() {
        // 一直生产(使用死循环来模拟一直生产)
        while(true){
            // 给仓库对象list加锁。
            synchronized (list){
                if(list.size() > 0){ // 大于0,说明仓库中已经有1个元素了。
                    try {
                        // 当前线程进入等待状态,并且释放Producer之前占有的list集合的锁。
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 程序能够执行到这里说明仓库是空的,可以生产
                Object obj = new Object();
                list.add(obj);
                System.out.println(Thread.currentThread().getName() + "--->" + obj);
                // 唤醒消费者进行消费
                list.notifyAll();
            }
        }
    }
}

// 消费线程
class Consumer implements Runnable {
    // 仓库
    private List list;

    public Consumer(List list) {
        this.list = list;
    }

    @Override
    public void run() {
        // 一直消费
        while(true){
            synchronized (list) {
                if(list.size() == 0){
                    try {
                        // 仓库已经空了。
                        // 消费者线程等待,释放掉list集合的锁
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 程序能够执行到此处说明仓库中有数据,进行消费。
                Object obj = list.remove(0);
                System.out.println(Thread.currentThread().getName() + "--->" + obj);
                // 唤醒生产者生产。
                list.notifyAll();
            }
        }
    }
}


 五:死锁

 public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = new Object();

        // t1和t2两个线程共享o1,o2
        Thread t1 = new MyThread1(o1,o2);
        Thread t2 = new MyThread2(o1,o2);

        t1.start();
        t2.start();
    }
}

class MyThread1 extends Thread{
    Object o1;
    Object o2;
    public MyThread1(Object o1,Object o2){
        this.o1 = o1;
        this.o2 = o2;
    }
    public void run(){
        synchronized (o1){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o2){

            }
        }
    }
}

class MyThread2 extends Thread {
    Object o1;
    Object o2;
    public MyThread2(Object o1,Object o2){
        this.o1 = o1;
        this.o2 = o2;
    }
    public void run(){
        synchronized (o2){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o1){

            }
        }
    }
}
QT控件 参考Qt的PIMPL设计模式实现使用QWidget控件绘制3D饼状图表和3D柱状图表,使用QChartView绘制圆柱体图表 工作中之前遇到了绘制3D饼状图表的需求,通过Qt 实现3维饼状图 一文,成功迅速解决问题,现在闲下来了,之前看QtTreePropertyBrowser库的源代码,就想着学习学习Qt的PIMPL模式,于是就参照PIMPL模式实现通过QWidget控件的paintEvent函数重新绘制3D饼状图表和3D柱状图表统计数据的显示效果, 而使用QChartView绘制圆柱体图表完全是取巧了,为了紧急完成工作采用的方法,实际上使用3D柱状图表显示统计数据更加合理。 阅读详情

相关推荐

ZYNQ实战:手把手教你用AXI4-Full IP核打通PL与PS的DDR数据通道

本文提供了一份详细的ZYNQ实战指南,手把手教你创建并使用具备AXI4-Full Master接口的自定义IP核,实现PL(可编程逻辑)通过AXI HP接口直接读写PS(处理系统)的DDR内存。文章涵盖了从Vivado硬件设计、IP核配置、地址映射到Vitis软件验证的完整流程,并深入解析了数据一致性(禁用Cache)等关键要点,旨在帮助开发者掌握ZYNQ异构计算中高效数据搬运的核心技术。

weixin_29193359的博客 284

多线程代码讲解

threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 开启多线程的两种方法 方法1: 常用 from threading impor...

dcw93178的博客 143

用HFSS复现经典论文:从零搭建带孔缝屏蔽箱体模型(附完整建模步骤与避坑指南)

本文详细介绍了如何使用HFSS电磁仿真软件复现经典论文中的带孔缝屏蔽箱体模型,包括从零搭建模型、设置激励与边界条件、求解优化及结果验证的全过程。特别提供了建模中的布尔运算陷阱、激励设置技巧等实操难点的避坑指南,帮助工程师和学生深入理解电磁屏蔽效能研究。

weixin_30530339的博客 158

【JavaSE】一文搞懂Java多线程,代码示例,清晰明了(上)

一文搞懂Java多线程,代码示例,清晰明了

小新要变强的博客 4199

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1179

ptrade量化策略之沪深300指数增强

本策略的核心是在沪深300股票池中选股,选择的股票都是市值比较大,业绩比较好的白马股,根据市场相对位置以及基本面因子来选择股票

qq_29301281的博客 1191

通过代码简单而深入的了解多线程的意义和使用

文章目录并发概述影响并发的因素硬件层面软件层面多线程如何影响服务端的并发数量并行概述线程线程的特点同步异步线程的构建方式继承Thread类案例举例实现Runnable接口案例举例Callable/Future 带返回值概述案例举例线程的生命周期/状态state线程的启动概述源码分析Thread.start()线程的停止线程什么时候会停止线程停止的方式 并发 概述 1.这里的并发,主要是针对同一个服务实体或者应用,能否承载的请求数量 比如:我们说,京东的出单,对于京东的服务器应用来讲,并发数量10万,就是

高新富的博客 368

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3952

windows编程学习——关键代码段

 多线程学习篇(一)关键代码段 一、基本概念 关键代码段:关键代码段也称之为临界区,工作在用户模式下。它是一小段代码,在执行前需要独占对一些共享资源的访问权。   优点:关键代码段工作在用户模式下,因此它简单,执行速度快。   缺点:不能在多个进程之间对线程进行同步(原因:它不是内核对象) 二、API 1、关键段相关API CRITICAL_SECTION结构体:这是一个未公开内...

Cry_Alone的博客 3592

6、基于深度强化学习的无人机路径规划

本文介绍了一种结合人工势场法的改进DQN深度强化学习算法在无人机路径规划中的应用。通过设计合理的网络结构、状态空间、动作空间和融合引力-斥力机制的奖励函数,实现了无人机在复杂环境中的自主避障与目标导向飞行。采用轻量级神经网络提升实时性,并在Gazebo仿真环境中进行训练与测试,结果表明该算法具有快速收敛、高成功率和良好适应性。实验评估指标包括损失函数、最大Q值和任务成功率,验证了方法的有效性。文章还探讨了其在物流配送、农业植保和环境监测等领域的应用前景,并展望了多无人机协同与复杂环境适应性等未来研究方向。

html8的博客 241

网络安全系列-四十三:使用Suricata分析恶意流量pcap文件

本文基于[网络安全系列-三十六:使用Suricata IDS分析pcap文件]和 [网络安全系列-四十二: Suricata之rulesets的激活、更新及动态加载]的基础上,使用suricata针对包含恶意流量的pcap文件进行分析,触发事件告警,并对suricata输出的日志进行逐个分析,让你掌握针对恶意流量的分析步骤,及怎么查看suricata输出的日志。

penriver的博客 2887

多线程同步之关键代码段(临界区)

关键代码段(临界区)工作在用户方式下。 关键代码段(临界区)是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权。通常把多线程中访问同一种资源的那部分代码当做关键代码段。 临界区好比公用电话亭,若想要使用电话亭,得先判断里面是否有人,若有人,则等待至里面的人离开。 临界区相关函数: void InitializeCriticalSection(LPCRITICAL_SECTIO

SurfingAnt的专栏 878

uniapp 全局弹窗

功能详解1.有的组件需要全局调用,不想要在一个页面里面一个个引入,现在就需要写入到全局中,直接全局触发。2.通过 $rechargePop就能全局触发 充值的弹窗实现步骤一、先把组件封装好,如 rechargePop组件位置 components/RechargePop/index.vue ,就定义一个methods open方法就可以 二、在同级别路径下定义一个 index.js 三、引入到main.js 四、全局调用this.$rechargePop(); 就能弹出那个弹窗

weixin_42066070的博客 657

整理的多线程部分基础知识点,让你写代码豁然开朗

掌握多线程几乎是现在互联网企业的必需要求,多线程在处理高并发时有不可替代的作用,工作中常常会使用多线程,却往往是拿来就用的方式,在学校时记得知识点已经有些模糊,面试时强行记忆的理论也忘的差不多了,所以在上班空闲时间整理概括了一下多线程的基础知识点,时不时拿出来巩固下基础理论,写代码时总会有种豁然开朗的感觉,由此希望这篇内容同样可以帮助到你。 创建线程的方式: 继承thread类 实现runnable接口(可传参) 实现callable接口和FutureTask(有返回值) 线程命名:setname

qq_42631041的博客 338

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java之多线程篇】——吐血整理Java多线程详解(知识点+代码)

目录: 线程基本概念 并行\并发的区别 多线程优点和何时使用多线程 多线程创建的两种方式:继承Thread类、实现Runnable接口(代码) 线程的生命周期 线程的同步 用线程同步解决线程安全问题的方式(一):同步代码快、同步方法、Lock锁(代码) 死锁 线程通信的例子——涉及wait()、notify()、notifyAll()) 面试题:sleep()和wait()的异同 生产者和消费者例题 用线程同步解决线程安全问题的方式(二):实现Callable()接口、线程池 基本

qq_50497708的博客 6507

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java学习教程,从入门到精通, Java 多线程编程语法知识点及案例代码(86)

Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

qq_45746668的博客 1494

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java中线程的知识_java多线程的基础知识总结(附代码)

本篇文章给大家带来的内容是关于java多线程的基础知识总结(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Java 主线程名我们启动的一个程序可以理解为一个进程, 一个进程中包含一个主线程, 线程可以理解为一个子任务. Java 中可以通过下面代码来获取默认的主线程名.System.out.println(Thread.currentThread().getName())...

weixin_35953060的博客 94

谈谈我对python3多线程知识点的总结!(含实例代码)

前言: 今天为大家带来的内容是,谈谈我对python3多线程知识点的总结!本文内容还是颇有参考意义,希望能够帮助到你。 首先: 我们了解多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 程序的运行速度可能加快。 在一...

weixin_45550143的博客 307

多线程的相关知识及代码的实现

1.首先知道实现线程的两种方式,正确来说应该是三种,但第三种不是很常用,我这里就省略不说了!     实现线程的常用方式就两种 1.继承Thread;2.实现Runnable接口;这两种又有什么区别啊?     首先你要清楚继承和接口的区别,那么你知道一定的区别啦!但主要的区别就是线程里空间数据的共享问题,只有实现Runnable才能实现数据共享的!肯定还有其他,这里就省     略啦!

rainjm的博客 368

c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

总结:视频中对于多线程讲的非常透彻,从线程基础概念—>.net不同版本出现的线程方法—>多线程常出现问题—>双色球项目实践,每个知识点都有代码实操,受益匪浅。附上学习笔记和实操代码。

Mr_DaYang的博客 2267

多线程入门知识点及代码详解及相关面试八股文

创建线程类(继承自Thread类)复写run ()(定义线程行为)创建线程对象(即实例化线程类)通过线程对象控制线程的状态(如运行、睡眠。挂起1停止)多线程的实现方式:1.将类声明为Thread的子类,该子类应该重写thread类的run方法,2.接下来可以分配并启动该子类的实例.1.新建一个类,并将类声明为Thread的子类,该子类应该重写thread类的run方法。//标准的多线程实现的类@Overridei < 100;i++) {2.创建多线程实例。

qq_43654669的博客 667

多线程在编写代码时一些知识点

实现多线程首先有多种方法,其中的 2种:。1:extend Thread 这个类覆盖run方法。2:implement Runable 借口 实现run方法。2种方式都可以做到多线程。但是也是有优缺点(不同之处)之分的 :比如 继承的话  就不能同时继承其他的类了。这就是一个弊端。而用借口就不一样。可以多次实现。再比如 使用继承的方法的话 Thread threa1=new Thread() ;

Alai_programmer的博客 458

java多线程基础(知识+代码示例)

实现多线程的两种基础方式: 方式一:继承Thread类 java中一个类只能继承一个父类,如果当前类已经继承了其他类了,则不能使用这种方法。 class Way1 extends Thread { private boolean bool = true;// 用于控制进程结束 public void run() {// 编写具体的逻辑代码 while (bool) { System.out.println("way1线程执行" + " 线程名为:" + Thread.curr

一条咸鱼的博客 2774

看langchain代码之前必备知识之 - Python 多线程: threading

在之前的文章中,我们分别学习了python的多进程,协程。在langchain-chatchat里同时还运用了python的多线程模块。例如:如上图代码所示,在Python中,使用threading模块可以实现多线程。通过创建线程对象,我们可以在不同的线程中执行不同的任务,并且这些线程可以同时运行,而不是按照顺序执行。Python的多线程功能使得我们能够同时执行多个任务,从而提高程序的效率和响应性。使用threading模块可以方便地创建和管理线程,使得编写多线程程序变得简单。

一起来研究langchain和langchain-chatchat 872

Java多线程知识点总结,超详细代码!(一)

一:多线程的基本概念 线程是进程中的一个执行场景,执行流程。每一个进程是一个应用程序,都有独立的内存空间,同一个进程中的线程共享进程中的内存和资源(堆内存和方法区内存共享,栈内存不共享,每个线程都有自己的)。 问1:计算机引入多进程的作用是什么?引入多线程的作用? 答1:可以提高CPU的使用率。可以提高进程的使用率。 问2:描述java程序的执行原理?(重点!) 答2:Java命令执行会启动JVM(Java虚拟机),JVM的启动表示启动了一个进程。该进程会自动启动一个"主线程",然后主线程负责调用某个类的m

fu605894385的博客 199

Java 多线程的一些知识 和简单代码实现

程序     存在磁盘中的引用 进程     运行在内存中的程序 线程 概念     轻量级的进程         同一进程下,可有许多的线程,这些线程共享堆内存和方法区         同一进程下,不同线程有不同的栈内存和程序计数器 作用     提高进程的执行效率 线程安全     synchronized  锁机制         锁对象         锁方法 ...

如果能思维清晰,从上往下,不断深入,就好了~~~ 310
上一篇: io流代码
下一篇: JSON解析
continueLR
博客等级 码龄6年 9粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值