JAVA135-185

news2024/11/26 7:46:02

JAVA135-185

  • 多线程
  • 多线程成员方法
  • 线程优先级
    • eg,卖票(线程的安全问题)需要解决线程同时抢的问题
  • 同步方法
  • LOCK锁
  • 等待唤醒机制
  • 阻塞队列实现等待唤醒机制
  • 多线程的六种状态
    • 红包
    • 抽奖箱抽奖
      • 比较
  • 线程池
  • 最大并行数
  • 网络编程
  • InetAdress
  • 端口号
  • 协议
    • 练习
    • Tcp发送和接收数据
  • 三次握手四次挥手
  • 多发多收

多线程

多线程的第一种启动方式:
1.自己定义一个类继承Thread
2.重写run方法
3.创建子类的对象,并启动线程

public class Demo {
    public static void main(String[] args) {
        Mythread t1=new Mythread();
        t1.start();//开启线程
    }


}

public class Mythread  extends  Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("HelloWorld");
        }
    }
}

多线程的第二种启动方式:
1.自己定义一个类实现Runnable接口
2.重写里面的run方法
3.创建自己的类的对象
4.创建一个Thread类的对象,并开启线程

//创建MyRun的对象
/表示多线程要执行的任务
MyRun mr = new MyRun();
//创建线程对象
Thread t1 = new Thread(mr);
/开启线程
t1.start();
public void run(){
//书写线程要执行的代码
for (int i =0;i< 100;i++){
∥获取到当前线程的对象
Thread t = Thread.currentThread();
System.out.println(t.getName() + "Helloworld!");
}
}

多线程的第三种实现方式:
特点:可以获取到多线程运行的结果
1.创建一个柒MyCallable实现callable接口
2.重写ca11~(是有返回值的,表示多线程运行的结果)
3.创建MyCallable的对象(表示多线程要执行的任务)
4.创建FutureTask的对象(作用管理多线程运行的结果)
5.创建Thread类的对象,并启动(表示线程)

//创建MyCallable的对象(表示多线程要执行的任务)
MyCallable mc = new MyCallable();
//创建FutureTask的对象(作用管理多线程运行的结果)
FutureTask<Integer> ft = new FutureTask<>(mc);
//创建线程的对象
Thread t1 = new Thread(ft);
//启动线程
t1.start();
//获取多线程运行的结果
Integer result = ft.get();
System.out.println(result);
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
//求1~100之间的和
int sum = 0;
for (int i = 1;i <= 100; i++){
sum = sum + i;
}
return sum;
}
}

多线程成员方法

在这里插入图片描述
返回此线程的名称
String getName()
设置线程的名字(构造方法也可以设置名
void setName(String name)
细节:
1、如果我们没有给线程设置名字,线程也是有默认的名字的
格式:Thread-x(x序号,从e开始的)
2、如果我们要给线程设置名字,可以用set方法进行设置,也可以构造方法设置
获取当前线程的对象
static Thread currentThread()
让线程休眠指定的时间,单位为毫秒
static void sleep(long time)

让线程休眠指定的时间,隐位为毫秒
static void sleep(long time)
细节:
1、哪条线程执行到这个方法,那么哪条线程就会在这里停留对应的时间
2、方法的参数:就表示睡眠的时间,单位毫秒
1秒=1000毫秒
3、当时间到了之后,线程会自动的醒来,继续执行下面的其他代码

线程优先级

在这里插入图片描述

eg,卖票(线程的安全问题)需要解决线程同时抢的问题

在这里插入图片描述

package com.itheima.thread02;

public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();
        MyThread t3=new MyThread();
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}

package com.itheima.thread02;

public class MyThread extends Thread {
  //表示所有
  static   int ticket = 0;//表示
static Object obj=new Object();





    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
           synchronized (obj){
               if (ticket < 100) {

                   ticket++;
                   System.out.println(getName() + "正在卖第" + ticket + "票!!");
               } else {
                   break;
               }

           }

        }
    }
}

同步方法

在这里插入图片描述

package com.itheima.thread02;

public class MyRunnable implements Runnable {
    int ticket = 0;

    @Override
    public void run() {
        while (true)
            if (extracted()) break;
    }

    private synchronized boolean extracted() {
        synchronized (MyRunnable.class) {
            if(ticket==100){
                return true;



            }else {
                ticket++;
                System.out.println(Thread.currentThread().getName()+"在卖"+ticket+"票");
            }
        }
        return false;
    }
}


package com.itheima.thread02;

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

        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        Thread t3 = new Thread(mr);
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();




    }
}

LOCK锁

在这里插入图片描述

等待唤醒机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima.waitmodify;

public class Cook extends  Thread{
    @Override
    public void run() {
        while (true){
            synchronized (Desk.lock){
                if(Desk.count==0){
                    break;
                }else{
                    if(Desk.foodFlag==1){

                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }else{
                        System.out.println("厨师做了一碗面条");
                        Desk.foodFlag=1;
                        Desk.lock.notifyAll();
                    }
                }
            }
        }
    }
}

package com.itheima.waitmodify;

public class Foodile extends Thread {
    @Override
    public void run() {
        /*
        1.循环
        2.同步代码块
        3.判断共享数据是否到了末尾(到了末尾)
        4. 判断共享数据是否到了末尾(没有到末尾)
         */


        while (true) {
            synchronized (Desk.lock) {
                if (Desk.count == 0) {
                    break;

                } else {
                    //先判断桌子上是否有面条,。没有就等待,如果有就开吃
                    //吃完之后要唤醒厨师继续做,把吃的总数-1  修改桌子的状态
                    if(Desk.foodFlag==0){
                        try {
                            Desk.lock.wait();//让当前线程跟锁绑定
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                        Desk.lock.notifyAll();
                    }else{

                        System.out.println("吃货正在吃面条还能吃+"+Desk.count+"wan");
                        Desk.lock.notifyAll();
                        Desk.count--;
                        Desk.foodFlag=0;
                    }




                }
            }
        }
    }
}

package com.itheima.waitmodify;

public class Desk {

    //作用:控制生产者和消费者的执行

    public  static  int foodFlag=0; //是否有面条,0:有面条 1:无面条
    //总个数
    public  static  int count=10;
    public  static Object lock=new Object();


}

阻塞队列实现等待唤醒机制

多线程的六种状态

在这里插入图片描述

红包

package com.itheima.test4cas1;

public class Test {
/*
微信中的抢红包也用到了多线程。
假设:100块,分成了3个包,现在有5个人去抢。
其中,红包是共享数据。
5个人是5条线程。
打印结果如下:
XXX抢到了XXX元
XXX抢到了XXX元
XXX抢到了XXX元
XXX没抢到
XXX没抢到
 */
    public static void main(String[] args) {
    MyThread t1=new MyThread();
    MyThread t2=new MyThread();
    MyThread t3=new MyThread();
    MyThread t4=new MyThread();
    MyThread t5=new MyThread();
t1.setName("xaa1");
t2.setName("xaaQ");
t3.setName("xaa1qweqwe");
t4.setName("xaa1qwes");
t5.setName("xaasadsssssdsadas1");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();

    }
}








package com.itheima.test4cas1;

import java.util.Random;

public class MyThread extends Thread {
    static double money = 200;
    static int count = 3;
    static final double MIN = 0.01;

    @Override
    public void run() {
        //循环
        //同步代码块
        //判断是否到末尾(到了)
        //判断是否到末尾(没到)
        //
        synchronized (MyThread.class) {
            if (count == 0) {//判断是否到末尾(到了)
                System.out.println(getName() + "没有抢到红包");
            } else {
                double prize = 0;
                //判断,共享数据是否到了末尾(没有到末尾)
                //不能直接随机
                if (count == 1) {
                    prize = money;
                    //表示此时是最后一个红包
                    //就无需随机,剩余的所有钱都是中奖金额
                } else {
                    //表示第一次第二次的中奖情况
                    Random r = new Random();
                    double bounds = money - (count - 1) * MIN;
                    prize = r.nextDouble(bounds);
                    if (prize < MIN) {
                        prize = MIN;
                    }
                }
                 money = money - prize;
                count--;
                System.out.println(getName()+"抢到了红包"+prize);


            }
        }
    }
}


抽奖箱抽奖

有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为{10,5,20,50,100,200,500,800,2,80,300,700};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”
随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
每次抽出一个奖项就打印一个(随机)
抽奖箱1又产生了一个10元大奖
抽奖箱1又产生了一个100元大奖
抽奖箱1又产生了一个200元大奖
抽奖箱1又产生了一个800元大奖
抽奖箱2又产生了一个700元大奖

package com.itheima.Test5;

import java.util.ArrayList;
import java.util.Collections;

public class MyThread extends Thread{
   ArrayList<Integer> list;
   
    public MyThread(ArrayList<Integer> list) {
        this.list = list;
    }


    @Override
    public void run() {
 while (true){
     synchronized (MyThread.class){
         if(list.size()==0){
                break;
         }
         else{

             Collections.shuffle(list);

             Integer prize = list.remove(0);
             System.out.println(getName()+"又产生了一个"+prize+"大奖");
         }
     }
     try {
         Thread.sleep(10);
     } catch (InterruptedException e) {
         throw new RuntimeException(e);
     }
 }

    }
}

package com.itheima.Test5;

import java.util.ArrayList;
import java.util.Collections;

public class Test {
    //有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池中的奖项为{10,5,20,50,100,200,500,800,2,80,300,700};
    //创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”
    //随机从抽奖池中获取奖项元素并打印在控制台上,格式如下:
    //每次抽出一个奖项就打印一个(随机)
    //抽奖箱1又产生了一个10元大奖
    //抽奖箱1又产生了一个100元大奖
    //抽奖箱1又产生了一个200元大奖
    //抽奖箱1又产生了一个800元大奖
    //抽奖箱2又产生了一个700元大奖
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        Collections.addAll(list ,10,5,20,50,100,200,500,800,2,80,300,700);
        MyThread t1=new MyThread(list);
        MyThread t2=new MyThread(list);
        t1.setName("抽奖箱1");
        t2.setName("抽奖箱2");

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

比较

package com.itheima.Test5;

import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {
   ArrayList<Integer> list;
   static ArrayList<Integer> list1=new ArrayList<>();
   static ArrayList<Integer> list2=new ArrayList<>();
    public MyCallable(ArrayList<Integer> list) {
        this.list = list;
    }




    @Override
    public Integer call() throws Exception {
        ArrayList<Integer> boxlist=new ArrayList<>();
        while (true){
            synchronized (MyCallable.class){
                if(list.size()==0){
                    System.out.println(Thread.currentThread().getName()+boxlist);
                    break;
                }
                else{

                    Collections.shuffle(list);

                    Integer prize = list.remove(0);
                  boxlist.add(prize);

//             System.out.println(getName()+"又产生了一个"+prize+"大奖");
                }
            }
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        if (boxlist.size()==0){
            return null;

        }else{return  Collections.max(boxlist);}

    }
}

线程池

在这里插入图片描述
在这里插入图片描述

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor
(核心线程数量,最大线程数量,空闲线程最大存活时间,任务队列,创建线程工厂,任务的拒绝策略);
参数一:核心线程数量
不能小于e
不能小于等于0,最大数量>=核心线程数量
不能小于e
参数二:最大线程数
参数三:空闲线程最大存活时间
参数四:时间单位
用TimeUnit指定
不能为nul1
参数五:任务队列
不能为null
不能为nul1
参数六:创建线程工厂
参数七:任务的拒绝策略

最大并行数

在这里插入图片描述

网络编程

在这里插入图片描述

InetAdress

package com.itheima.MyInetAdressDemo;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyInetAdressDemo1 {
    public static void main(String[] args) throws UnknownHostException {
        /*
        static InetAddress getByName(String host)    确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
        String getHostName()                     获取此IP地址的主机名
        String getHostAddress()                   返回文本显示中的IP地址字符串
         */
        InetAddress address = InetAddress.getByName("DESKTOP-4LVLCVP");
        System.out.println(address);
        String name = address.getHostName();
        System.out.println(name);
        String ip = address.getHostAddress();
        System.out.println(ip);
    }
}

端口号

在这里插入图片描述

协议

在这里插入图片描述
在这里插入图片描述

package com.itheima.MyInetAdressDemo;

import java.io.IOException;
import java.net.*;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //发送数据
        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //绑定端口:以后我们就是通过这个端口往外发送数据
        //空参:所有可用的端口中随机一个进行使用
        //有参:指定端口号进行绑定
        DatagramSocket ds = new DatagramSocket();
        //2.打包数据
        String str = "你好威猛啊!!!!";
        byte[] bytes = str.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
        //3.发送数据
        ds.send(dp);
        ds.close();



    }
}

练习

package com.itheima.UDPTEST;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //按照下面的要求实现程序
        //UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
        //UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
        //1.创建对象DatagramSocket
        DatagramSocket ds = new DatagramSocket();
        //2.打包数据
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入你要说的话");
            String str=sc.nextLine();
            if("886".equals(str)){
                break;
            }
            byte[] bytes = str.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            int port =10086;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            //3发送数据
            ds.send(dp);
        }
        //4.释放资源
        ds.close();

    }
}
package com.itheima.UDPTEST;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象DatagramSocket的对象
        DatagramSocket ds = new DatagramSocket(10086);
        //2.接受数据包
        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
        while (true) {
            ds.receive(dp);
            //3.解析数据包
            byte[] data = dp.getData();
            int len = dp.getLength();
            String ip = dp.getAddress().getHostAddress();
            String name = dp.getAddress().getHostName();
            //打印数据
            System.out.println("ip wei " + ip + ",主机名为" + name + "的人,发送了数据" + new String(data, 0, len));
        }


    }
}

Tcp发送和接收数据

package com.itheima.a05tcpDemo1;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {    public static void main(String[] args) throws IOException {

    //TCP协议,发送数据
//1.创建Socket对象
//细节:在创建对象的同时会连接服务端
// 如果连接不上,代码会报错
    Socket socket =new Socket("127.0.0.1",10000);
//2.从连接通道中获取输出流
    OutputStream os = socket.getOutputStream();
    //写出数据
    os.write("你好你好".getBytes());
    //3.释放资源
    os.close();
    socket.close();
}
}

package com.itheima.a05tcpDemo1;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //Tcp协议,接收数据
        //1.创建对象SeverSocket
        ServerSocket ss = new ServerSocket(10000);
        //2.监听客户端链接
        Socket socket = ss.accept();
        //3.从链接通道中 获取输入流读取数据
        InputStream is = socket.getInputStream();
        int b;
        while ((b=is.read())!=-1){
            System.out.println((char) b);
        }

    }

}

三次握手四次挥手

在这里插入图片描述

多发多收


package com.itheima.a07Test1;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        //1.创建对象绑定10000端口
        ServerSocket ss=new ServerSocket(10000);
        //2.等待客户端链接
        Socket socket = ss.accept();
        //3.读取数据
        InputStreamReader isr=new InputStreamReader(socket.getInputStream());
        int b;
        while((b= isr.read())!=-1){
            System.out.println((char)b);
        }
    //4.释放资源
    socket.close();
        ss.close();
    }
}

package com.itheima.a07Test1;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        //客户端:多次发送数据
        //服务器:接受多次数据,并打印
        //1.创建Socket对象并链接服务端
        Socket socket =new Socket("127.0.0.1",10000);
        //2.写数据
        Scanner sc = new Scanner(System.in);
        String str=sc.nextLine();
        System.out.println("请输入您要发送的信息");
        OutputStream os=socket.getOutputStream();
         os. write(str.getBytes());
         //3.释放资源
        socket.close();

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mutipart

含义&#xff1a; 多部分的、复合 场景&#xff1a; 位置&#xff1a;package org.springframework.boot.autoconfigure.web.servlet; Springboot中autoconfigration包下web包下servlet下DispatcherServletAutoConfiguration中&#xff1a; 有一个默认加载的Bean Bean …

stm32通用外部spi下载算法实现

参考硬汉嵌入式&#xff1a;【实战技能】任何支持SWD接口的单片机都可以方便移植的SPI Flash烧写算法制作_哔哩哔哩_bilibili 该up主提供的stm32H7的模板工程&#xff0c;目前需求是实现基于正点原子探索者stm32f407zet6W25Q128 下载算法实现步骤 使用cubemx建立一个LED工程…

postgresql walsender源码分析

专栏内容&#xff1a;postgresql内核源码分析个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 介绍 数据结构 WAL对端的状态 walsender进程 WALsender交互流程 在…

【连续介质力学】张量分量的变换定律

张量分量的变换定律 张量的分量是依赖于坐标系的&#xff0c;所以当坐标系发生旋转&#xff0c;张量分量也会发生改变&#xff0c;张量分量与坐标系通过分量变换规律互相关联起来的。 考虑在正交基 ( e ^ 1 , e ^ 2 , e ^ 3 ) (\hat e_1, \hat e_2, \hat e_3) (e^1​,e^2​,…

【51单片机】串口通信使用串口通信控制LED灯

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【51单片机】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;串口通信 &#x1f60e;代码…

HTTP1.1(四)URI

一 URI的基本格式以及与URL的区别 ① URI直观感受 1&#xff09;URI是HTTP协议的重要组成部分2&#xff09;ABNF如何严格定义URI ② URL、URN、URI ③ URI细讲 ④ URI的组成 ⑤ ABNF关于URI定义 blob:http 地址的原理及生成方法 video 标签 src 带有blob:http data…

NetCore发布到Docker-单机

一.git安装 1.下载 https://github.com/git/git/releases/tag/v2.40.1 2.将本地的安装包上传到 linux 服务器上&#xff0c;我这里放在 /opt/git/ 目录下 3.解压压缩包&#xff0c;得到目录 git-2.40.1&#xff0c;位置在 /opt/git/git-2.40.1 tar -zxvf git-2.40.1.tar.gz 4.…

【刷题之路】LeetCode 225. 用队列实现栈

【刷题之路】LeetCode 225. 用队列实现栈 一、题目描述二、解题1、主要思路解析2、先实现栈3、实现各个接口3.1、初始化接口3.2、push接口3.3、pop接口3.4、myStackTop接口3.5、myStackEmpty接口3.6、myStackFree接口 一、题目描述 原题连接&#xff1a; 225. 用队列实现栈 题…

如何选择合适的自动化测试工具? 我教你

目录 前言 选择最佳自动化测试工具的重要性 自动化测试工具的种类 选择自动化测试工具时要考虑的因素 自动化测试工具的选择标准 前言 自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中&#xff0c;几乎任一软件开发过程都需要在开发阶段的某个…

测试工具-JIRA

软件测试工具—JIRA使用 1.创建 项目&#xff1a;一般为业务线名称 问题类型&#xff1a;任务、故事、缺陷等 概要&#xff1a;bug的简要描述&#xff0c;一般写出定位地方和目前现状 Sprint&#xff1a;一般为业务线迭代简称 测试阶段&#xff1a;按照各公司的测试流程对应标…

vlc搭建rtsp直播Demo

文章目录 学习链接本地视频文件作为数据源推流步骤拉流步骤 本地摄像头作为数据源拉流步骤 学习链接 ffmpeg 使用VLC亲手搭建RTSP直播点播 本地视频文件作为数据源 推流步骤 点击媒体->流 点击添加&#xff0c;选择视频文件&#xff0c;后点击串流 点击串流后&#xf…

linux异步通知实验

一、异步通知简介 中断是处理器提供的一种异步机制&#xff0c;配置好中断后就可以让处理器去处理其他的事情&#xff0c;当中断发生以后会执行中断服务函数&#xff0c;在中断服务函数中做具体的处理。 Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备&#xff0…

04:mysql--DCL

目录 1:介绍 2:语法 3:DCL的使用 4:权限 1:介绍 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库 用户、控制数据库的访问 权限。 2:语法 DCL-管理用户 查询用户 use mysql; select * from user; 创建用户 create user "用户名&quo…

缓存服务器概述

一、概述 主要功能&#xff1a;应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题 架构设计&#xff1a;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构 常用消息队列&#xff1a;ActiveMQ&#xff0c;RabbitMQ&#xff0c;ZeroMQ&#xff0c;Kafka…

谷歌chrome浏览器升级新版后字体显示不清楚解决方案

谷歌chrome浏览器升级新版后字体显示不清楚解决方案 参考图片&#xff1a; Chrome更新至版本Chrome 109.0.5414.120 字体看不清 浏览器症状与表现 Chrome更新至版本Chrome 109.0.5414.120 字体看不清&#xff1b;会很细&#xff0c;在设置中选择自定义的字体&#xff0c;仍无法…

MySQL数据库笔记-基础篇

文章目录 MySQL概述数据库相关概念小总结 MySQL数据库版本&#xff1a;启动与停止客户端连接关系型数据库数据模型小总结 SQLSQL通用语法SQL分类DDL数据库操作查询创建数据类型数据类型的使用练习 修改删除小总结 DML添加数据修改数据删除数据小总结 DQLDCL MySQL概述 数据库相…

BI技巧丨矩阵甘特图

BOSS&#xff1a;白茶&#xff0c;我们最近有很多项目&#xff0c;能不能做个甘特图&#xff1f; 白茶&#xff1a;没问题&#xff01;&#xff08;应用市场上随便找个甘特图就OK了嘛&#xff01;&#xff09; BOSS&#xff1a;对了&#xff0c;不要那种点进来会有点卡&#xf…

二、数据结构1:单链表 模板题+算法模板(单链表)

文章目录 算法模板单链表题目模板 模板题单链表原题链接题目思路题解 算法模板 单链表题目模板 // head存储链表头&#xff0c;e[]存储节点的值&#xff0c;ne[]存储节点的next指针&#xff0c;idx表示当前用到了哪个节点 int head, e[N], ne[N], idx;// 初始化 void init() …

【001】C++的第一个程序Hello World

C的第一个应用程序&#xff08;Hello World程序&#xff09; 引言一、代码二、代码解释三、注意事项四、注释语句总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。 &#x1f449;…

《JavaEE》网络编程套接字

文章目录 Socket我们来解释一下上面叫做有无连接我们再来理解一下上面是可靠传输和不可靠传输面向字节流与面向数据报的区别&#xff08;后期会具体分析这个&#xff09;全双工 单双工 UDPDatagramSocketDatagramPacket我们来尝试写一下UDP版本的代码 TCPServerSocketSocket我们…