Java学习十,线程

2026 具身智能 VLA/WAM 全栈学习与训练路线:从动作建模、SFT、RL 到世界模型的 RTX PRO 6000 96GB 单卡实战指南 我会把这张表做成“”而不是只列论文名:先核对每个模型截至的公开代码、训练目标和数据接口,再单独给你一套。对于没有公开、只有推理代码或训练细节不完整的模型,我会明确标出来,避免把“论文里提到”误写成“可复现”。目前有一个重要更新:。截至今天 NVIDIA 官方开源主线已经是换成 Cosmos-Reason2-2B/Qwen3-VL 架构,动作端仍是连续路线,而且官方明确给出单卡微调时默认只训练,峰值显存约。所以你的 96GB 单卡对 GR00T SFT 非常宽裕。可以。下面我按,把它整理成一张真正面向“ 阅读详情

1.线程的创建实现类

       

在创建的过程中,我们需要了解两个类:1.Thread类 2.Runnable类

1.1 Thread类

     

Thread类中常用的方法:

    

1.2 Runnable接口

   

2. 线程的创建和使用

2.1 Thread类实现

代码如下:

package com_imooc.xiancheng;

class Mytest extends Thread {
    //实现线程,必须重写run()方法
    public void run() {
        System.out.println("线程启动了");
    }
}

public class xiancheng_test {
    public static void main(String[] args) {
        Mytest t = new Mytest();
        /**
         * 启动线程使用的是start()方法
         * 一个线程只能启动一次
         */
        t.start();
    }
}

结果输入如下:

   

可能有的小伙伴会说,这线程和我们之前使用main的方法是一致的呀,没有什么不同的呀,其实我们此时的程序中两个线程,既:主线程和子线程,为了让我们更加清楚的明白些,我们代码修改如下:

package com_imooc.xiancheng;

class Mytest extends Thread {
    //实现线程,必须重写run()方法
    public void run() {
        System.out.println("线程启动了");
    }
}

public class xiancheng_test {
    public static void main(String[] args) {

        System.out.println("我是主线程1");

        Mytest t = new Mytest();
        /**
         * 启动线程使用的是start()方法
         * 一个线程只能启动一次
         */
        t.start();

        System.out.println("我是主线程2");
    }
}

结果输出为:

自此,我们可以很清楚的看出,并不是我们顺序执行的代码,而是先主后子的执行方式;

当然,我们也可以直接用for来多运行几次,代码如下:

package com_imooc.xiancheng;

class Mytests extends Thread {
    public Mytests(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName()+"正在run的线程:"+i);
        }
    }
}

public class xianchengs_test {
    public static void main(String[] args) {
         Mytests m1=new Mytests("a");
         Mytests m2=new Mytests("b");

         m1.start();
         m2.start();
    }
}

结果为:

可以看出上面例子的输出并不是顺序执行的,由此可见是抢占式的运行;

2.2 Runnable接口实现

   首先你得明白为什么有了Thread类还需要Runnable接口:

    

在明白为什么需要创建Runnable之后,我们创建他的代码:

package com_imooc.xiancheng;

class test implements Runnable {

    //重写run方法可以调用Thread类的静态方法currentThread()
    @Override
    public void run() {
        int i = 0;
        while (i < 10)
            System.out.println(Thread.currentThread().getName() + "正在进行" + i++);
    }
}

public class runnable_test {
    public static void main(String[] args) {
        //启动进程的时候需要调用Thread的构造方法Thread(Runnable r)
        test able = new test();
        Thread t = new Thread(able);
        t.start();

        test able1 = new test();
        Thread t1 = new Thread(able1);
        t1.start();
    }
}

结果:

和之前的结果一样,t和t1都是执行了10次,有没有办法让我们实现两个线程一共执行10次呢??

当然有,方法如下:

package com_imooc.xiancheng;

class test implements Runnable {
    int i = 0;

    //重写run方法可以调用Thread类的静态方法currentThread()
    @Override
    public void run() {
        while (i < 10)
            System.out.println(Thread.currentThread().getName() + "正在进行" + i++);
    }
}

public class runnable_test {
    public static void main(String[] args) {
        //启动进程的时候需要调用Thread的构造方法Thread(Runnable r)
        test able = new test();
        Thread t = new Thread(able);
        t.start();

        Thread t1 = new Thread(able);
        t1.start();
    }
}

结果如下:

在代码中,因为t和t1的开启都是由同一个test类实例而来,所以内存共享数据int i的变化,最终两个线程抢占执行;

最后查看一下线程的生命周期;

        

2.3 sleep方法

    

package com_imooc.xiancheng;

class tests implements Runnable {
    //重写run方法可以调用Thread类的静态方法currentThread()
    @Override
    public void run() {
        for (int i = 0; i < 15; i++) {
            System.out.println(Thread.currentThread().getName() + "执行第" + i + "次");
            //sleep()方法需要捕获InterruptedException异常
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class runnables_test {
    public static void main(String[] args) {
        //启动进程的时候需要调用Thread的构造方法Thread(Runnable r)
        tests able = new tests();
        Thread t = new Thread(able);
        t.start();

        Thread t1 = new Thread(able);
        t1.start();
    }
}

2.4 join方法

join方法是等待线程执行完以后再去执行下面的;

package com_imooc.xiancheng;

class join_test implements Runnable {
    //重写run方法可以调用Thread类的静态方法currentThread()
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "执行中");
        }
    }
}

public class join {
    public static void main(String[] args) {
        //启动进程的时候需要调用Thread的构造方法Thread(Runnable r)
        join_test able = new join_test();
        Thread t = new Thread(able);
        t.start();
        try {
            t.join();
            //代表执行1秒以后不管执行完与否,执行下面的语句;
            //t.join(1111);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < 10; i++) {
            System.out.println("主程序结束" + i);
        }
    }
}

3.线程的优先级

除了数字可以表示以外,我们也可用优先级的常量来表示:

最后,我们可以通过以下的方法来获取和设置优先级:

代码实例:

package com_imooc.xiancheng;

class youxianji_test implements Runnable {
    private String name;

    public youxianji_test(String name) {
        this.name = name;
    }

    //重写run方法可以调用Thread类的静态方法currentThread()
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(name + "正在进行" + i);
        }
    }
}

public class youxianji {
    public static void main(String[] args) {
        //1.获取主线程的优先级
        int main_number = Thread.currentThread().getPriority();
        System.out.println("主线程的优先级是:" + main_number);

        //2.设置线程的优先级
        youxianji_test able = new youxianji_test("aaa");
        Thread t = new Thread(able);
        t.setPriority(10);  //设置的具体方法
        t.start();

        youxianji_test able1 = new youxianji_test("bbb");
        Thread t1 = new Thread(able1);
        t1.setPriority(1);  //设置的具体方法
        t1.start();
    }
}

结果如下:

值得注意的是:线性的优先级并不是越高,就越要先执行,而是和操作系统,cpu,代码执行顺序等有关的.

4.多线程的同步(synchronized)

现在列举一个银行取款的例子:

bank.java

package com_imooc.xiancheng.synchronized_test;

public class bank {
    private int zhanghao;
    private double money;

    public bank(int zhanghao, double money) {
        this.zhanghao = zhanghao;
        this.money = money;
    }

    public int getZhanghao() {
        return zhanghao;
    }

    public void setZhanghao(int zhanghao) {
        this.zhanghao = zhanghao;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    //存款
    public void cun(double m) {
        double money = getMoney();
        money += m;
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        setMoney(money);
        System.out.println("cun存款后余额为:" + money);
    }

    //取款
    public void qu(double m) {
        double money = getMoney();
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        money = money - m;
        setMoney(money);
        System.out.println("qu取款后余额为:" + money);
    }

    @Override
    public String toString() {
        return
                "账号:" + zhanghao +
                        ", 余额:" + money;
    }
}

运行的main.java

package com_imooc.xiancheng.synchronized_test;

class yue implements Runnable {
    bank bank;
    String type;
    double money;

    public yue(com_imooc.xiancheng.synchronized_test.bank bank, String type, double money) {
        this.bank = bank;
        this.type = type;
        this.money = money;
    }

    @Override
    public void run() {
        if (type.equals("-")) {
            bank.qu(money);
        } else if (type.equals("+")) {
            bank.cun(money);
        }
    }
}

public class tongbu {
    public static void main(String[] args) {
        //创建银行账户
        bank b = new bank(1, 500);
        //创建存取钱两个线程
        yue y = new yue(b, "-", 200);
        yue y1 = new yue(b, "+", 300);
        Thread t = new Thread(y);
        Thread t1 = new Thread(y1);
        //启动线程
        t1.start();
        t.start();
        try {
            t1.join();
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(b.toString());
    }
}

结果输出:

我们可以看出,运行的程序出现了脏读,所以我们需要synchronized(上锁)来保证多线程下数据的一致性;

所以我们的代码中可以直接在public中加入synchronized:

也可以用synchronized (this) {}:

5.线程的通信

 

此时我们模拟一个MQ的实例来说明我们的通讯问题:

queue.java

package com_imooc.xiancheng.tongxun_test;

public class queue {
    private int n;

    public synchronized int getN() {
        System.out.println("输出:" + n);
        return n;
    }

    public synchronized void setN(int n) {
        System.out.println("存入:" + n);
        this.n = n;
    }
}

main.java

package com_imooc.xiancheng.tongxun_test;

class duilie implements Runnable {
    queue queue;
    String type;
    int i = 0;

    public duilie(com_imooc.xiancheng.tongxun_test.queue queue, String type) {
        this.queue = queue;
        this.type = type;
    }

    @Override
    public void run() {
        if (type.equals("set")) {
            while (true) {
                queue.setN(i++);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } else if (type.equals("get")) {
            while (true) {
                queue.getN();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class tongxun {
    public static void main(String[] args) {
        queue q = new queue();
        new Thread(new duilie(q, "set")).start();
        new Thread(new duilie(q, "get")).start();
    }
}

结果是:

仅仅从前几个数据,我们就可看出此MQ是有问题的,因为一次入列以后,竟然有两次的出列行为,这是万万不允许的错误,而我们要解决代码的bug,就用到了我们线程间的通信:

queue.java

package com_imooc.xiancheng.tongxun_test;

public class queue {
    private int n;
    boolean flag = false;   //flag=true 存在,可取出; flag=false 不存在,不可取出

    public synchronized int getN() {
        //不存的时候在等待
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("输出:" + n);
        flag = false;   //消费完毕,队列没有数据
        notifyAll();    //启动所有线程(以防止死锁)
        return n;
    }

    public synchronized void setN(int n) {
        //存在的时候等待
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("存入:" + n);
        this.n = n;
        flag = true;    //生产完毕,队列有数据
        notifyAll();    //启动所有线程(以防止死锁)
    }
}

结果运行:

此时MQ输入输出正常;

 

 

 

 

 

 

 

 

 

 

 

python电子学会三级的零碎笔记 ‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。 阅读详情

相关推荐

10xGenomics官方可视化工具——Loupe Browser

Loupe Browser是⼀款10xGenomics开发的交互式桌⾯应⽤程序,⽤于探索10x单细胞数据,可以用来找出感兴趣的细胞、找出显著差异表达的基因、鉴定细胞类型、探索细胞亚类和数据共享。

weixin_47195452的博客 3359

【JAVA】学习笔记⑩:线程

借用下优快云博客作为自己的学习笔记,还请各位大佬包容与指点程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码.进程((process)正在内存中运行的应用程序,如运行中的QQ,运行中的音乐播放器。进程是操作系统进行资源分配的最小单位.线程(thread)进程可进一步细化为线程,是一个进程内部的最小执行单元,是操作系统进行任务调度的最小单元,隶属于进程.本文章将简述java中线程相关的内容。

qq_40419478的博客 1876

EtherCat 从站开发中遇到的问题分享

EtherCat从站 AX58100

yu_arius的博客 2058

Java之多线程学习笔记十 —— 线程休眠

Java之多线程学习笔记十 —— 线程休眠 线程休眠的应用 package pers.ylw.state; import java.text.SimpleDateFormat; import java.util.Date; public class TestSleep2 { public static void main(String[] args) { //ten...

影龙武的博客qq_43594119 421

十一、机器学习进阶知识:径向基神经网络(RBFNN)的实现(Python,附源码及数据集)

本文对径向基神经网络(RBFNN)的理论基础及建模步骤进行介绍,之后使用Python实现基于RBFNN的数据预测,通俗易懂,适合新手学习,附源码及实验数据集。

weixin_42051846的博客 1万+

电商数据分析18——电商广告投放的数据分析与优化

在当今的电商行业中,广告投放是提高品牌知名度、吸引潜在客户和增加销售额的关键策略之一。随着市场竞争的加剧,仅仅依靠直观判断和传统方法已经无法满足广告投放的需求。数据分析在这里扮演了至关重要的角色,它可以帮助企业更准确地定位目标受众,评估广告效果,优化广告内容,从而提高广告效率和投资回报率(ROI)。

theskylife的博客 5703

Java并发学习之十——用线程工厂创建线程

本文是学习网络上的文章时的总结,感谢大家无私的分享。  1、工厂模式是最有用的设计模式。它是一个创造模式,还有他的目的是创建一个 或者几个类对象的对象。有了这个工厂,我们有这些优势集中创建对象: 更简单的改变了类的对象创建或者说创建这些对象的方式; 更简单的为了限制的资源限制了对象的创建。 更简单的生成创建对象的统计数据。 2、Java提供一个接口,ThreadFactory接口实

我的编程之路 4000

Qwen-Image(阿里通义千问)技术浅析(一)

Qwen-Image(阿里通义千问多模态模型)是阿里巴巴推出的视觉-语言多模态大模型,能够理解图像内容并完成复杂的跨模态任务。

m0_75253143的博客 679

JAVA学习十:多线程

多线程 1.线程与进程 进程:指一个内存中运行的应用程序,每一个进程的内存空间都是独立的,且是互不共享的。 线程:是进程中的一个个的执行路径,多个线程间共享一块内存空间,线程之间可以自由切换,并发执行,一个进程至少有一个线程。 线程实际上是进程基础上的进一步划分,一个进程启动后,里面的若干执行路径可以划分称为若干线程。 2.同步与异步 同步:排队执行。效率低但是安全。 异步:同时执行。效率高但是数据不安全。 3.并发与并行 并发:指两个或多个事件在同一时间段内发生。(比如一天内发生的事情) 并行:指两个或多

RichardMLu的博客 209

AUTOSAR进阶图解==>AUTOSAR_SWS_ADCDriver

本文深入解析了AUTOSAR ADC Driver的架构设计和技术实现。主要内容包括:1)ADC Driver在AUTOSAR分层架构中的定位及核心功能;2)详细的模块架构设计,涵盖初始化管理、组转换管理、优先级处理等核心子组件;3)全面的配置模型说明,包括主配置类、通用配置、通道配置等关键数据结构;4)状态机机制和操作序列分析。通过分层设计和标准化接口,ADC Driver实现了硬件抽象和软件解耦,提供了良好的可移植性和可维护性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 788

Qt C++ 串口调试助手

1. **串口配置**:支持自动检测可用串口,可配置波特率(9600~921600)、数据位(5~8)、校验位(无/奇/偶/标记/空格)、停止位(1/1.5/2)。- HEX 模式发送时,输入格式需为十六进制字符(0-9、A-F),可带空格(如 `01 A3 FF`)或不带空格(如 `01A3FF`)。// 发送模式:true=HEX,false=ASCII。// 字符串转HEX字节数组。ui->parity->addItems({"无", "奇校验", "偶校验", "标记校验", "空格校验"});

寒寒豆豆软件公司的博客 147

Java学习(十)之网络与线程

一、网络编程: Socket 步骤: 建立Socket对象连接服务器端口号,Socket socket = new Socket(“127.0.0.1”,5555);获得输入输出流, PrintWriter writer = new PrintWriter(socket.getOutputStream());读写,writer.println(); 二、多线程 2. 多线程实现方法: 抽象的说,thread是一个工人,而runnable是工作的内容 a. 建立Runnable对象,代表新线程的任务; b

sup_bkht的博客 190

诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库

DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组)

蚂蚁小兵 6222

Java并发编程学习十:线程协作

Java并发编程学习系列

weixin_41402069的博客 608

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java学习日志(十): 多线程,创建多线程的三种方式

Java学习日志(十) 并发与并行 进程与线程 线程调度 主线程 创建多线程程序 创建多线程程序的第一种方式:继承thread类 创建多线程程序的第二种方式:实现Runnable接口 创建多线程程序的第三种方式:匿名内部类

Sakuraaaaaaa的博客 1508

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java多线程学习十:线程池实现“线程复用”的原理

线程复用原理 我们知道线程池会使用固定数量或可变数量的线程来执行任务,但无论是固定数量或可变数量的线程,其线程数量都远远小于任务数量,面对这种情况线程池可以通过线程复用让同一个线程去执行不同的任务,那么线程复用背后的原理是什么呢? 线程池可以把线程和任务进行解耦,线程归线程,任务归任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。在线程池中,同一个线程可以从 BlockingQueue 中不断提取新任务来执行,其核心原理在于线程池对 Thread 进行了封装,并不是每次执

徘徊在牛A与牛C之间的码农 525

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java学习笔记(十)---线程动画

2018.7.25 其实线程动画咱们很早前就接触过了,只是你不知道那是基于线程动画实现的。比如咱们玩的弹跳球、坦克大战、飞机大战,都是基于线程来实现的。那么今天咱们就来用线程实现一个弹跳小球。 一、 根据上一篇博客,线程的使用及其简单,只需要把你要让线程干的事情写道run()方法里面,然后再用stat()方法启动它就好了。那么先来分析,画球其实就是画一个填充圆,不多说了,重要是如何让它看起来...

lzh 1952

java学习笔记(十)多线程基础

一、程序,进程,线程 1、程序 使用计算机语言编写的一段可执行的,能完成某种功能的静态代码 2、进程 程序执行的动态过程 开始运行到关闭或停止运行 一个程序可以同时运行多次,每次运行都是一个进程 3、线程 一个程序中可以包含多个任务,一个任务一个线程, 一个进程可以有多个任务,同时运行这些任务就是多线程 二、多线程 多个任务流程同时执行互不影响时使用多线程 1、并发和并行 所有程序都是运行在CPU上 并发:在CPU单核上交替运行多个线程 并行:利用CPU的多核特性同时运行多个线程 2、多线程优点 减少了阻塞

My的博客 616

黑马程序员--Java基础学习十(Java线程)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口,将Runnable作为Thread构造函数的参数传入实现。 线程的生命周期: 1.新建状态(New):用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被

BlueSky_YL1989的专栏 478

java多线程学习(十) happen before 原则

多线程中happens -before 原则

z1340954953 706

Java多线程再学习,温故知新(十)线程间的通信join

当一个线程执行时,想调用另外一个线程加塞 public class Demo { public void a(Thread joinThread) { System.out.println("方法a执行了..."); joinThread.start(); try { joinThread.join(); } catch (InterruptedException...

行天际的博客 217

java学习(十) —— java中的多线程概述

进程概述 进程:正在运行的程序,是系统进行资源分配和调用的独立单位。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。 每一个进程都有它自己的内存空间和系统资源。 我们编写的程序用来描述进程要完成哪些功能以及如何完成; 数据集则是程序在执行过程中所需要使用的资源; 进程控制块用来记录进程...

weixin_34409357的博客 110

JAVA基础(JAVA SE)学习笔记(十)多线程

多线程创建方式、同步机制、线程通信

时时师师的博客 524

Java实习生面试复习(十):线程池ThreadPoolExecutor学习

程池是什么,好处是啥? 线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。 通过线程池复用线程有以下几点优点: * 减少资源创建 => 减少内存开销,创建线程占用内存 * 降低系统开销 => 创建线程需要时间,会延迟处理的请求 * 提高稳定稳定性 => 避免无限创建线程引起的OutOfMemoryError【简称OOM】 **在阿里巴巴的《Java 开发手册》中

Linn的博客 465

Java多线程学习(十)CompletionService学习

CompletionService整合了Executor和BlockingQueue的功能。可以将多个Future任务添加到BlockingQueue的队列中,然后获取是可以调用take(阻塞)或poll(非阻塞)方法从队列中获取任务的执行结果。 添加到队列中的任务时按照执行完成时间的顺序添加进去的,先完成的任务先添加到队列中,所以从队列中获取任务结果也一定是先获取到最先计算完成的。   E...

wanderlustLee的博客 309

Java学习day100 并发(十)(线程与Swing:运行耗时的任务、使用Swing工作线程、单一线程规则)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。 day100 并发(十)(线程与Swing:运行耗时的任务、使用Swing工作线程、单一线程规则) ...

Zzehao的博客 835
上一篇: Java学习九,字符串和集合
下一篇: Java学习十一,IO流
yí無所冇
博客等级 码龄9年 78粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值