0基础学java-day17-(多线程基础)

26 篇文章 1 订阅
订阅专栏

一、线程

1 线程相关概念

1.1 程序(program)

1.2 进程 

1.3 什么是线程 

1.4 其他相关概念

package com.hspedu;

/**
 * @author 林然
 * @version 1.0
 */
public class CpuNum {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        //获取当前电脑CPU数量
        int cpuNums = runtime.availableProcessors();
        System.out.println(cpuNums);
    }
}

2 线程基本使用

2.1 创建线程的两种方式

2.2 线程应用案例 1-继承 Thread  

【主线程结束了不代表其他线程结束了】 

package com.hspedu.threaduse;

/**
 * @author 林然
 * @version 1.0
 * 演示通过继承 Thread 类创建线程
 */
public class Thread01 {
    public static void main(String[] args) throws InterruptedException{
        //创建一个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() {//写上自己的业务逻辑
        super.run();
        //该线程每隔 1 秒。在控制台输出 “喵喵, 我是小猫咪”
        while (true){
            try {
                Thread.sleep(1000);
                System.out.println("喵喵, 我是小猫咪" +(++times)+"线程名"+Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(times==80)
            {
                break;//当 times 到 80, 退出 while, 这时线程也就退出
            }
        }


    }
}

 

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

package com.hspedu.threaduse;

/**
 * @author 林然
 * @version 1.0
 * 通过实现接口 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
        //Proxy threadProxy = new Proxy(tiger);
        //Proxy.start();
    }
}
class Animal {
}
class Tiger extends Animal implements Runnable {
    @Override
    public void run() {
        System.out.println("老虎嗷嗷叫....");
    }
}
//建议的线程模拟
//线程代理类 , 模拟了一个极简的 Thread 类
class Proxy implements Runnable{//你可以把 Proxy 类当做 ThreadProxy(代理类)
    private Runnable target =null;//属性,类型是 Runnable
    @Override
    public void run() {
        if(target!=null)
        {
            target.run();
        }
    }

    public Proxy(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());
            //休眠一秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(count==10)
            {
                break;
            }
        }
    }
}

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

package com.hspedu.threaduse;

/**
 * @author 林然
 * @version 1.0
 */
public class Thread03 {
    public static void main(String[] args) {
        T1 t1 =new T1();//启动第 1 个线程
        T2 t2 =new T2();//启动第 2 个线程
        Thread thread =new Thread(t1);
        Thread thread1 = new Thread(t2);
        thread.start();
        thread1.start();
    }
}
class T1 implements Runnable {
    int times = 0;

    @Override
    public void run() {
        while (true) {
            //每隔 1 秒输出 “hi”,输出 5 次
            System.out.println("hello,world " + (++times));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times == 5) {
                break;

            }
        }
    }
}
class T2 implements Runnable {
    int times = 0;

    @Override
    public void run() {
        while (true) {
            //每隔 1 秒输出 “hello,world”,输出 10 次
            System.out.println("hi " + (++times));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (times == 10) {
                break;

            }
        }
    }
}

 2.5 线程如何理解

3 继承 Thread vs 实现 Runnable 的区别 

package com.hspedu.ticket;

/**
 * @author 林然
 * @version 1.0
 * 使用多线程,模拟三个窗口同时售票 100 张
 */
public class SellTicket {
    public static void main(String[] args) {
//        SellTicket01 sellTicket01=new SellTicket01();
//        SellTicket01 sellTicket011=new SellTicket01();
//        SellTicket01 sellTicket012=new SellTicket01();
//        //这里我们会出现超卖..
//        sellTicket01.start();//启动售票线程
//        sellTicket011.start();//启动售票线程
//        sellTicket012.start();//启动售票线程
        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){
            ticketnum=ticketnum-1;
            if(ticketnum<=0){
                System.out.println("售票结束");
                break;
            }
            //休眠50毫秒
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票" + " 剩余票数=" + (--ticketnum));
        }
    }
}

4 线程终止

1 基本说明

.4.2 应用案例 

package com.hspedu.exit_;
/**
 * @author 林然
 * @version 1.0
 */
public class Thread_Exit_   {

    public static void main(String[] args) throws InterruptedException{
         T t = new T();
         t.start();
         //如果希望主线程去控制t1,就是可以修改变量就可以了
        //让t1退出run方法
        //休眠10秒再通知终止
        Thread.sleep(1000*10);
        t.setLoop(false);
    }
}
class T extends Thread{
    int count =0;
    //设置一个控制变量
    private boolean loop=true;

    public void setLoop(boolean loop) {
        this.loop = loop;
    }

    @Override
    public void run() {
        while (loop){
            //休眠50毫秒
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("T 运行中"+(++count));
        }
    }
}

 二、线程常用方法

1 常用方法第一组

2 注意事项和细节 

3 应用案例 

package com.hspedu.method;

/**
 * @author 林然
 * @version 1.0
 */
public class ThreadMethod01 {
    public static void main(String[] args) throws InterruptedException{
        //测试相关的方法
        T t = new T();
        t.setName("林然");
        t.setPriority(Thread.MIN_PRIORITY);
        t.start();//启动子线程
        //主线程打印5 hi ,然后我就中断 子线程的休眠
        for(int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("hi " + i);
        }
        System.out.println(t.getName() + " 线程的优先级 =" + t.getPriority());//1

        t.interrupt();//当执行到这里,就会中断 t线程的休眠.


    }
}
class T extends Thread { //自定义的线程类
    @Override
    public void run() {
        while (true) {
            for (int i = 0; i < 100; i++) {
                //Thread.currentThread().getName() 获取当前线程的名称
                System.out.println(Thread.currentThread().getName() + "  吃包子~~~~" + i);
            }
            try {
                System.out.println(Thread.currentThread().getName() + " 休眠中~~~");
                Thread.sleep(5000);//20秒
            } catch (InterruptedException e) {
                //当该线程执行到一个interrupt 方法时,就会catch 一个 异常, 可以加入自己的业务代码
                //InterruptedException 是捕获到一个中断异常.
                System.out.println(Thread.currentThread().getName() + "被 interrupt了");
            }
        }
    }
}

 4 常用方法第二组

5 应用案例 

测试 yield join 方法 ,注意体会方法的特点,
package com.hspedu.method;

/**
 * @author 林然
 * @version 1.0
 */
public class ThreadMethod02 {
    public static void main(String[] args) throws InterruptedException{
        T2 t2 =new T2();
        t2.start();

        for(int i = 1; i <= 20; i++) {
            Thread.sleep(1000);
            System.out.println("主线程(小弟) 吃了 " + i  + " 包子");
            if(i == 5) {
                System.out.println("主线程(小弟) 让 子线程(老大) 先吃");
                //join, 线程插队
                t2.join();// 这里相当于让t2 线程先执行完毕
                //Thread.yield();//礼让,不一定成功..
                System.out.println("线程(老大) 吃完了 主线程(小弟) 接着吃..");
            }

        }
    }
}
class T2 extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            try {
                Thread.sleep(1000);//休眠1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("子线程(老大) 吃了 " + i +  " 包子");
        }
    }
}

 6 课堂练习

package com.hspedu.method;

public class ThreadMethodExercise {
    public static void main(String[] args) throws InterruptedException {
        Thread t3 = new Thread(new T3());//创建子线程
        for (int i = 1; i <= 10; i++) {
            System.out.println("hi " + i);
            if(i == 5) {//说明主线程输出了5次 hi
                t3.start();//启动子线程 输出 hello...
                t3.join();//立即将t3子线程,插入到main线程,让t3先执行
            }
            Thread.sleep(1000);//输出一次 hi, 让main线程也休眠1s
        }
    }
}

class T3 implements Runnable {
    private int count = 0;

    @Override
    public void run() {
        while (true) {
            System.out.println("hello " + (++count));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count == 10) {
                break;
            }
        }
    }
}

 7 用户线程和守护线程

8 应用案例 

下面我们测试如何将一个线程设置成守护线程【将main设置为用户进程,T1为守护进程】 

【先设置为保护线程,再启动,注意顺序】

package com.hspedu.method;

/**
 * @author 林然
 * @version 1.0
 */
public class ThreadMethod03 {
    public static void main(String[] args) throws InterruptedException{
        MyDaemonThread myDaemonThread = new MyDaemonThread();
        //如果我们希望当main线程结束后,子线程自动结束
        //,只需将子线程设为守护线程即可
        myDaemonThread.setDaemon(true);
        myDaemonThread.start();

        for( int i = 1; i <= 10; i++) {//main线程
            System.out.println("宝强在辛苦的工作...");
            Thread.sleep(1000);
        }
    }
}
class MyDaemonThread extends Thread {
    public void run() {
        for (; ; ) {//无限循环
            try {
                Thread.sleep(1000);//休眠1000毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("马蓉和宋喆快乐聊天,哈哈哈~~~");
        }
    }
}

 三、线程的生命周期

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

2 线程状态转换图 

【如果将Runable状态细分为两个状态,那么就是所谓的七个状态】        

3 写程序查看线程状态 

package com.hspedu.state_;

/**
 * @author 林然
 * @version 1.0
 */
public class ThreadState_ {
    public static void main(String[] args) throws InterruptedException{
        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()  {
        for (int i = 0; i < 10; i++) {
            System.out.println("hi"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 四、线程的同步

1 先看一个问题

2.Synchronized 

2.1 线程同步机制

2 .2同步具体方法-Synchronized 

package com.hspedu.syn;

/**
 * @author 林然
 * @version 1.0
 */
public class SellTicket {

    public static void main(String[] args) {
        //测试一把
        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方法变量
    //1. public synchronized void sell() {} 就是一个同步方法
    public synchronized void sell() { //同步方法, 在同一时刻, 只能有一个线程来执行sell方法
            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));
    }

    @Override
    public void run() {
        while (loop) {

            sell();//sell方法是一个同步方法
        }
    }
}

3.分析同步原理

五、互斥锁 

1 基本介绍

【一个对象对应一把锁,所以我们应对同一个对象进行上锁】

2 使用互斥锁来解决售票问题 

代码块加锁,和方法上加锁
package com.hspedu.syn;

/**
 * @author 林然
 * @version 1.0
 */
public class SellTicket {

    public static void main(String[] args) {
        //测试一把
        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
    public synchronized static void m1() {
    }
    //2. 如果在静态方法中,实现一个同步代码块.
    /*
    synchronized (SellTicket03.class) {
        System.out.println("m2");
    }
*/
    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));
            }
    }

    @Override
    public void run() {
        while (loop) {

            sell();//sell方法是一个同步方法
        }
    }
}

3.注意事项和细节

六、线程的死锁 

.1 基本介绍

2 应用案例 

3 应用案例 

package com.hspedu.syn;

/**
 * @author 林然
 * @version 1.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");
                }
            }
        }
    }
}

4.释放锁

4.1下面操作会释放锁 

4.2 下面操作不会释放锁 

七、本章作业 

1.作业一

package com.hspedu.homework;

import java.util.Scanner;

/**
 * @author 林然
 * @version 1.0
 */
public class Homework01 {
    public static void main(String[] args) {
        A a =new A();
        a.start();
        B b = new B(a);//一定要注意.
        b.start();
    }
}
class A extends Thread{
    private boolean loop=true;
    @Override
    public void run() {
        while(loop){
            System.out.println((int)(Math.random())*100+1);
            //休眠
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
         }
        System.out.println("a线程退出...");
    }
    public void setLoop(boolean loop) {//可以修改loop变量
        this.loop = loop;
    }
}
//直到第2个线程从键盘读取了“Q”命令
class B extends Thread {
    private A a;
    private Scanner scanner = new Scanner(System.in);

    public B(A a) {//构造器中,直接传入A类对象
        this.a = a;
    }

    @Override
    public void run() {
        while (true) {
            //接收到用户的输入
            System.out.println("请输入你指令(Q)表示退出:");
            char key = scanner.next().toUpperCase().charAt(0);
            if(key == 'Q') {
                //以通知的方式结束a线程
                a.setLoop(false);
                System.out.println("b线程退出.");
                break;
            }
        }
    }
}

2.作业二 

package com.hspedu.homework;

/**
 * @author 林然
 * @version 1.0
 */
public class Homework02 {
    public static void main(String[] args) {
        T t =new T();
        new Thread(t).start();
        new Thread(t).start();
    }
}
//编程取款的线程
//1.因为这里涉及到多个线程共享资源,所以我们使用实现Runnable方式
//2. 每次取出 1000
class T implements Runnable{
    private static int money = 10000;
    @Override
    public void run() {
        while(true){
            synchronized (this){
                if(money>=1000){
                    money-=1000;
                    System.out.println("取出1000"+"余额:"+money);

                }
                else {
                    System.out.println("没钱了"+"余额:"+money);
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

Spark-Java Day 17字符串 多线程
Y_Bug的博客
11-21 1291
字符串 1.1 字符串拼接相关问题 1 常量+常量 结果常量池 2 常量与变量 或 变量与变量 结果堆 3 拼接后调用intern()方法:结果在常量池 4 concat方法拼接,结果都是在堆 1.2 字符编码转变 new String(str.getBytes(“UTF-8”), “UTF-8”); 1.3 正则匹配 ^[验证规则]{验证次数}$ ^开始 $结束 1.4 字符串操作其他方法 a 替换 replace(“要替换的内容”,“替换成内容”) 不支持正则 replaceFirst(.
多线程-day02.docx
12-12
在“多线程-day02”的习资源中,我们深入探讨了Java内存模型以及多线程的特性与控制机制。 **Java内存模型** Java内存模型,也称为JVM内存模型,是Java程序员理解和掌握的基础知识,特别是在进行并发编程时。它...
Day19--Java多线程编程入门
gitee_nanzhi66的博客
08-06 1514
多线程是一种并发编程技术,它允许程序同时执行多个线程。线程是程序执行的基本单位,一个程序至少有一个线程,即主线程。通过使用多线程,可以在一个程序中同时处理多个任务,提高程序的效率和响应能力。多线程编程是Java中一个强大的特性,它能够提高程序的性能和响应能力。了解如何创建和管理线程,以及如何处理线程同步和通信,是编写高效并发程序的关键。掌握这些基础知识后,你可以进一步习更高级的并发工具和设计模式,如线程池、并发集合等。
Day38-Java基础多线程2
m0_46053885的博客
05-10 889
提到池,大家应该能想到的就是水池。水池就是一个容器,在该容器中存储了很多的水。那么什么是线程池呢?线程池也是可以看做成一个池子,在该池子中存储很多个线程。线程池存在的意义:系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线程时,频繁的创建和销毁线程对系统的资源消耗有可能大于业务处理是对系统资源的消耗,这样就有点"舍本逐末"了。针对这一种情况,为了提高性能,我们就可以采用线程池。线程池在启动的时,会创建大量空闲线程,当我们向线程池提交任务的时,线程池就。
Java基础多线程篇:多线程最佳实践
喵手的博客
08-01 1210
在计算机科领域,多线程是一种重要的编程概念。它允许程序同时执行多个任务,提高了程序的并发性和响应性。对于Java开发者而言,了解和掌握多线程编程是非常重要的一项技能。本文将从零基础开始介绍Java多线程的概念和用法,帮助读者理解多线程的原理和实践技巧。我们将深入探讨多线程的最佳实践,包括源代码解析、应用场景案例、优缺点分析和具体的Java代码测试用例。本文将带领读者逐步Java多线程编程的基础知识和高级概念。我们将通过详细的源代码解析和实际应用场景案例,帮助读者理解多线程的内部工作原理和使用技巧。
Java多线程基础
♾️
12-07 2198
多线程基础 回顾 1 File类:表示一个文件或文件夹 表示文件: 创建 createNewFile(); 删除 delete(); deleteOnExit(); 存在性判断 exists(); canExecute() canRead() canWrite() getAbsoluatePath(); getParent(); getName(); ...
JAVA-Day45】Java常用类StringBuffer解析
热门推荐
沉淀、分享、成长,让自己和他人都能有所收获!
10-16 2万+
Java中,StringBuffer是一个用于处理字符串的类,它允许我们对字符串进行动态操作,如拼接、插入、删除等。通过本篇文章的习,我们深入了解了Java中常用类StringBuffer的各种方法及其应用场景。同时,我们也比较了StringBuffer与String的不同之处,并分享了一些在实际开发中的最佳实践。希望本文能够对你在Java字符串处理中提供有价值的指导。
JAVA-Day80】多线程通信
沉淀、分享、成长,让自己和他人都能有所收获!
02-15 2万+
Java 开发中,多线程通信是一项至关重要的技术。通过多线程通信,不同的线程可以有效地交换信息和协调任务,从而提高程序的效率和性能。本篇博客将深入探讨多线程通信的概念、实现方法、应用场景以及常见面试题,帮助读者更好地理解和应用多线程编程。多线程是指在同一时间内,多个线程同时执行不同的任务。相比于单线程程序,多线程程序能够更充分地利用 CPU 资源,提高程序的并发性和响应性。在 Java 中,可以通过Thread类或者实现Runnable接口来创建和管理线程。
Java习(java基础)-韩顺平老师
楠小弟的博客
02-18 7824
java基础习笔记,mysql基础笔记
JAVA-Day52】深度解析 Java TreeSet 集合
沉淀、分享、成长,让自己和他人都能有所收获!
10-23 2万+
博主在本篇文章中将深入解析Java中的TreeSet集合,探讨其特性、应用场景以及性能优化。通过多级标题结构,将引领读者从初步认识TreeSet到最佳实践,最终挑战高质量的面试题,全方位、深度解析TreeSet在Java中的应用。
JAVA-Day53】Java集合类HashMap详解
沉淀、分享、成长,让自己和他人都能有所收获!
10-26 2万+
作为一名Java开发者,熟练掌握集合类是至关重要的。其中,HashMap作为Java中常用的集合类之一,具有重要的地位。本篇博客将带您深入了解HashMap的各种操作技巧、实际应用场景以及面试可能涉及的问题,同时深度探讨其实现原理与性能优化,让您全面掌握HashMap的精髓。HashMap是Java中的一种数据结构,它提供了一种键值对的映射关系,允许使用键来查找值。在实际开发中,它能够高效地进行数据存储和检索,是Java编程中常用的集合类之一。
Java基础知识-day06 【线程、同步】.pdf
10-26
Java基础知识-day06 【线程、同步】 本文档内容主要讲解了Java中的多线程运行原理、线程同步、线程状态等知识点。 一、多线程运行原理 多线程运行原理是指在Java中可以同时执行多个线程的机制。通过继承Thread类...
Java基础知识-day05 【异常、线程】.pdf
10-26
Java基础知识-day05 【异常、线程】 本资源主要介绍Java基础知识中的异常和线程两个部分。异常是程序在执行过程中出现的非正常的情况,Java处理异常的方式是中断处理。异常可以分为Error和Exception两类,Error是...
多线程-day01.docx
12-12
在本教程中,我们将探讨多线程基础知识,包括并发与并行的区别,进程与线程的概念,以及如何在 Java 中创建和管理线程。 并发与并行是两个经常混淆的概念。并发指的是多个任务在一段时间内交替执行,它们可能在...
java基础语法-day01
01-04
Java基础语法-day01】 Java是一门广泛使用的高级编程语言,它由Sun Microsystems公司(现已被Oracle公司收购)于1995年发布。Java的设计目标是具有平台独立性,能够编写一次,到处运行。这得益于其跨平台的Java...
Java-网络
2301_81543552的博客
09-14 794
Java中的网络编程主要涉及使用Socket类进行网络通信,以及理解各种网络协议。以下是一些关键概念和示例代码,帮助您入门。
Java企业面试题3
m0_74972727的博客
09-15 830
1. break和continue的作用(智*图) break:用于完全退出一个循环(如 for, while)或一个 switch 语句。当在循环体内遇到break语句时,程序会立即跳出当前循环体,继续执行循环之后的代码。 continue:用于跳过当前循环体中剩余的部分,并开始下一次循环。如果是在 for 循环中使用continue,则会直接进行条件判断以决定是否执行下一轮循环。 2. if分支语句和switch分支语句的异同之处(智*图) 相同点:都是用来根据不同的条件执行不同的代码块。
Android Studio 2024与2022 解决Read timed out和connect timed out的问题
2301_80035882的博客
09-14 767
如果在新建Android项目时报错:Read timed out或者connect timed out。
JDK17新增语法特性
最新发布
2201_76124988的博客
09-20 339
从springboot3.0开始,已经不支持JDK8,转变为JDK17参考资料:官方博客。
Java语言基础:IF-THEN-ELSE实例解析
它是一种面向对象的语言,支持多线程和动态特性。Java程序首先被编译成字节码,然后由Java虚拟机(JVM)解释执行,实现了“一次编写,处处运行”的跨平台特性。 Java平台由两部分组成:Java虚拟机(JVM)和Java应用...
写文章

热门文章

  • javaweb学习(day11-监听器Listener&&过滤器Filter) 2658
  • 个人python学习-Day10-飞机大战 2220
  • javaweb学习day01(HTML) 2132
  • javaweb学习(day10-服务器渲染技术) 1358
  • 0基础学java-day14-(集合) 1338

分类专栏

  • 前端技术栈 3篇
  • 韩顺平javaweb 14篇
  • 韩顺平0基础学java 26篇
  • 玩转计算机网络 9篇
  • 个人学习-机器学习 3篇
  • 个人python学习笔记 11篇

最新评论

  • 前端技术栈三(vue+Axios)

    2301_78193967: 试过安装淘宝镜像失败了,一搜说是淘宝镜像被淘汰了,楼主你知道怎么解决吗...

  • 前端技术栈三(vue+Axios)

    征途黯然.: I'm impressed by this article about 前端技术栈三vueAxios. The expertise is impressive.表情包

  • 0基础学java-day26(满汉楼实战)

    菜菜小林然: 可私信我要相关工具类的链接

  • 个人python学习-Day10-飞机大战

    m0_72906484: 哥们,网盘文件能发一下吗

  • 计算机网络(day1-3)概述-计算机网络的性能

    CSDN-Ada助手: 恭喜你撰写了第20篇博客!标题“计算机网络(day1-3)概述-计算机网络的性能”非常吸引人。你的文章内容真实而有深度,对计算机网络的性能进行了详细的概述,让读者对这个领域有了更清晰的认识。 对于下一步的创作建议,我想谦虚地提出一些建议。首先,你可以进一步探索计算机网络性能的不同方面,比如带宽、延迟、吞吐量等。这些指标对网络性能的影响非常重要,可以帮助读者更好地理解网络性能的本质。 其次,你可以考虑通过案例研究或实际应用来加深读者的理解。通过实际的示例,读者可以更好地理解网络性能在实际场景中的应用和意义。 最后,我鼓励你继续保持对新技术的关注,并将其应用于你的博客创作中。计算机网络是一个不断发展的领域,了解最新的技术和趋势可以使你的博客更有价值和吸引力。 再次恭喜你的辛勤创作,期待读到更多精彩的博客!

最新文章

  • 前端技术栈二(promise&模块化编程)
  • 前端技术栈三(vue+Axios)
  • javaweb学习(day14-ThreadLocal&&文件上传下载)
2024年22篇
2023年45篇
2021年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜小林然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家柘城玻璃钢雕塑费用沙滩主题的商场美陈中山玻璃钢卡通雕塑浙江省玻璃钢仿真雕塑人物玻璃钢雕塑批发代理洛阳抽象玻璃钢仿铜雕塑奥体商场大厅美陈晋城校园不锈钢玻璃钢仿铜雕塑郑州二手卡通玻璃钢雕塑玻璃钢卡通雕塑价格报价镜面玻璃钢仿铜雕塑厂吉林环保玻璃钢雕塑供应商玻璃钢灯光雕塑桐乡玻璃钢雕塑定做抚州特色玻璃钢雕塑制作浙江常用商场美陈多少钱玻璃钢雕塑制作标准保证书户外商场美陈哪里买大兴区玻璃钢雕塑三月商场美陈玻璃钢雕塑一般多厚啊仿真玻璃钢雕塑设计厂家江苏拉丝玻璃钢雕塑多少钱玄武秋季商场美陈盘龙区玻璃钢雕塑产品厂家营口小品玻璃钢雕塑订做玻璃钢人物雕塑批发代理泡沫玻璃钢景观雕塑定做价格桔子玻璃钢雕塑定制厂家南通玻璃钢卡通门头雕塑设计香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化