二十章总结

news2025/1/21 12:17:20

20.1线程介绍

世间有很多工作都是可以同时完成的。例如,人体可以同时进行呼吸、血液循环、思考问题等活动;用户既可以使用计算机听歌,也可以使用它打印文件。同样,计算机完全可以将多种活动同时进行,这种思想放在 Java 中被称为并发,而将并发完成的每一件事情称为线程。

在Java 中,并发机制非常重要。在以往的程序设计中,我们都是一个任务完成后再进行下一个任务。这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制被称为多线程。然而,有必要强调的是,并不是所有编程语言都支持多线程。

多线程是非常复杂的机制,比如同时阅读 3 本书,首先阅读第 1本书第1章,然后再阅读第2本书第1章,再阅读第3本书第 1章,回过头再阅读第1本书第2章,以此类推,就体现了多线程的复
杂性。

既然多线程这样复杂,那么它在操作系统中是怎样工作的呢?其实 Java 中的多线程在每个操作系统中的运行方式也存在差异,在此着重说明多线程在 Windows 操作系统中的运行模式。Windows操作系统是多任务操作系统,它以进程为单位。一个进程是一个包含有自身地址的程序,每个独立执行的程序都称为进程。也就是说每个正在执行的程序都是一个进程。系统可以分配给每个进程一段有限的使用CPU 的时间(也可以称为 CPU 时间片),CPU 在这段时间中执行某个进程,然后下一个时间片又跳至另一个进程中去执行。由于 CPU 转换较快,所以使得每个进程好像是同时执行一样。

一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。在单线程中,程序代码按调用顺序依次往下执行。如果需要一个进程同时完成多段代码的操作,就需要使用多线程。

20.2创建线程

20.2.1继承Thread类

Thread 类是java.lang 包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。Thread 类中常用的两个构造方法如下:
public Thread0:创建一个新的线程对象。

public Thread(String threadName): 创建一个名称为 threadName 的线程对象继承 Thread 类创建一个新的线程的语法如下:

public class ThreadTest extends Thread{
}


完成线程真正功能的代码放在类的 run()方法中,当一个类继承 Thread 类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入 run()方法中,然后调用 Thread 类中的 start0方法执行线程也就是调用 run()方法。
Thread 对象需要一个任务来执行,任务是指线程在启动时执行的工作,该工作的功能代码被写在run()方法中。run0方法必须使用以下语法格式:
 

public void run(){
}

当执行一个线程程序时,就自动产生一个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序航为单线程程序,如本章以前的程序都是单线程程序。主方法线程启动由 Java 虚拟机负责,程序员负责启动自己的线程。代码如下:
 

public static void main(String[] args) {
new ThreadTest().start();
}

例20.1让线程循环打印1~10的数字

package 二十章;

public class ThreadTest {

	public static void main(String[] args) {
		Thread th=new Thread() {
			public void run() {
				System.out.println("happpy");
			}
		};
		th.start();
	}

}

20.2.2实现Runnable接口

到目前为止,线程都是通过扩展 Thread 类来创建的,如果程序员需要继承其他类(非 Thread类)而且还要使当前类实现多线程,那么可以通过 Runnable 接口来实现。例如,一个扩展JFrame 类的GUI程序不可能再继承 Thread 类,因为 Java 语言中不支持多继承,这时该类就需要实现 Runnable 接口使其具有使用线程的功能。实现 Runnable 接口的语法如下:
 

public class Thread extends Object implements Runnable

例20.2让窗口中的图标动起来

package 二十章;

import java.awt.Container;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class SwingAndThread extends JFrame{	
	int count=0;//图标横坐标

	public SwingAndThread() {
		setBounds(300,200,150,100);//绝对定位窗口大小与位置
		Container container=getContentPane();//主容器
		container.setLayout(null);//使窗口不使用任何布局管理器
		
		Icon icon=new ImageIcon("D:\\eclipse\\wc\\二十章\\1.gif");//图标对象
		JLabel jl=new JLabel(icon);//显示图标的标签
		jl.setBounds(10,10,200,50);//设置标签的大小与位置
		Thread t=new Thread() {//定义匿名线程对象
			public void run() {
				while(true) {
					jl.setBounds(count,10,200,50);//将标签的横坐标用变量表示
					try {
						Thread.sleep(500);//使线程休眠500毫秒
					}catch(InterruptedException e) {
						e.printStackTrace();		
					}
				count+=4;//使横坐标每次加4
				if(count>=200) {
					count=10;//当图标到达标签的最右边时,使其回到标签最左边
				}
			}
		}
	};
	t.start();//启动线程
	container.add(jl);//将标签添加到容器
	setVisible(true);//使窗口可见
	setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗口的关闭方式
	}
	public static void main(String[] args) {
		new SwingAndThread();
	}

}

20.3   线程的生命周期


线程的生命周期
线程具有生命周期,其中包含7种状态,分别为出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态。出生状态就是线程被创建时处于的状态,在用户使用该线程实例调用 start()方法之前线程都处于出生状态;当用户调用start()方法后,线程处于就绪状态(又被称为可执行状态);当线程得到系统资源后就进入运行状态。
一旦线程进入可执行状态,它会在就绪与运行状态下转换,同时也有可能进入等待、休眠、阻塞或死亡状态。当处于运行状态下的线程调用Thread类中的wait()方法时,该线程便进入等待状态,进入等待状态的线程必须调用Thread类中的notify()方法才能被唤醒,而调用notifyAlI()方法可将所有处于等待状态下的线程唤醒;当线程调用Thread 类中的sleep()方法时,则会进入休眠状态。如果一个线程在运行状态下发出输入/输出请求,该线程将进入阻塞状态,在其等待输入/输出结束时线程进入就绪状态,对于阻塞的线程来说,即使系统资源空闲,线程依然不能回到运行状态。当线程的run()方法执行完毕时,线程进入死亡状态。


一种能控制线程行为的方法是调用 slep0方法,sleep0方法需要一个参数用于指定该线程休间该时间以毫秒为单位。在前面的实例中,已经演示过 sleep0方法,它通常是在 un0方法内被使用。sleep0方法的语法如下:

try{
Thread.sleep(2000);

}catch(lnterruptedException e)

e,printStackTrace();}

上述代码会使线程在2秒之内不会进入就绪状态。由于sleep0方法的执行有可能抛出 ieruptedException异常,所以将sleep()方法的调用放在try-catch 块中。虽然使用了s00p0万法的线程在一段时间内会醒来,但是并不能保证它醒来后进入运行状态,只能保证它进入就绪状态。为了使读者更深入地了解线程的休眠方法,来看下面的实例。

 
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
 
import javax.swing.*;
 
public class SleepMethodTest extends JFrame{
	private static Color[]color= {Color.BLACK,Color.BLUE,Color.CYAN,Color.GREEN,
			Color.YELLOW,Color.RED,Color.PINK,Color.LIGHT_GRAY
	};
	private static final Random rand=new Random();
	private static Color getC() {
		return color[rand.nextInt(color.length)];
	}
public SleepMethodTest() {
	Thread t=new Thread(new Runnable() {
		int x=30;
		int y=50;
		public void run() {
			while(true) {
				try {
					Thread.sleep(100);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
				Graphics g=getGraphics();
				g.setColor(getC());
				g.drawLine(x, y, 100, y++);
				if(y>=80) {
					y=50;
				}
			}
		}
	});
	t.start();
	
}
	public static void main(String[] args) {
		init(new SleepMethodTest(),100,100);
	}
	public static void init(JFrame f,int i,int h){
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		f.setSize(i,h);
		f.setVisible(true);
	}
 
}

 
在本实例中定义了 gctC0方法,该方法用于随机产生 Color类型的对象并且在产生线程的匿名内部类中使用 getGraphics0方法获取 Graphics 对象,使用该对象调用 setColor0方法为图形设置颜色。调用 drawLine0方法绘制-条线段,同时线段会根据纵坐标的变化自动调整。


20.4.2 线程的加入


如果当前某程序为多线程程序,假如存在一个线程 A,现在需要插入线程 B,并要求线程B您行完毕,然后再继续执行线程 A,此时可以使用 Thread 类中的 join0方法来完成。这就好比此时读在看电视,突然有人上门收水费,读者必须付完水费后才能继续看电视。当某个线程使用 join0方法加入另外一个线程时,另一个线程会等待该线程执行完毕后再继鳞下面来看一个使用join0方法的实例。行。

[例20.4]让进度条A 等待进度条 B(实位置:资源包TMsI204)在项目中创建 JoinTest 类,该类继承了 JFrame类。该实例包括两个进度条,进度条的进度由线程*控制,通过使用 join0方法使上面的进度条必须等待下面的进度条完成后才可以继续。

package 二十章;
 
import java.awt.BorderLayout;
 
import javax.swing.JFrame;
import javax.swing.JProgressBar;
 
public class JoinTest extends JFrame {
    private Thread threadA;
    private Thread threadB;
    private JProgressBar progressBar=new JProgressBar();
    private JProgressBar progressBar2=new JProgressBar();
    
    public static void main(String[]args) {
        JoinTest test=new JoinTest();
        test.setVisible(true);
    }
    public JoinTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(200,200,200,100);
        getContentPane().add(progressBar,BorderLayout.NORTH);
        getContentPane().add(progressBar2,BorderLayout.SOUTH);
        progressBar.setStringPainted(true);
        progressBar2.setStringPainted(true);
        threadA=new Thread(new Runnable() {
            int count=0;
            public void run() {
                while(true) {
                    progressBar.setValue(++count);
                    try {
                        Thread.sleep(100);
                        threadB.join();
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        threadA.start();
        threadB=new Thread(new Runnable() {
            int count=0;
            public void run() {
                while(true) {
                    progressBar2.setValue(++count);
                    try {
                        Thread.sleep(100);
                        
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                }
                    if(count==100);
                    break;
            }
        }
        });
        threadB.start();
    }
}


    

在本实例中同时创建了两个线程,这两个线程分别负责进度条的滚动。在线程A 的rm0方法线程B 的对象调用 join0方法,而 join0方法使当前运行线程暂停,直到调用 join0方法的线程执行后再执行,所以线程 A 等待线程 B 执行完毕后再开始执行,即下面的进度条滚动完毕后上面的进才开始滚动。


20.4.3线程的中断


以往有的时候会使用 stop0方法停止线程,但当前版本的JDK 早已废除了 stop0方法,不建议stop0方法来停止一个线程的运行。现在提倡在 run0方法中使用无限循环的形式,然后使用-个标标记控制循环的停止。
如果线程是因为使用了 sleep0或 wait0方法进入了就绪状态,可以使用 Thread 类中intemupi0龙使线程离开 run0方法,同时结束线程,但程序会抛出 InterruptedException 异常,用户可以在处游常时完成线程的中断业务处理,如终止 while 循环。
下面的实例演示了某个线程使用 interrupted0方法,同时程序抛出了 InterruptedExceptio 幕,t异常处理时结束了 while 循环。在项目中,经常在这里执行关闭数据库连接和关闭 Socket 连接等[例20.5

package 二十章;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
	public class InteerruptedSwing extends JFrame {
		
		public InteerruptedSwing(){
		JProgressBar progressBar = new JProgressBar();	//创建进度条	
		getContentPane().add(progressBar, BorderLayout.NORTH);//将进度条放置在窗体合适位置
		JButton button=new JButton("停止");
		getContentPane().add(button,BorderLayout.SOUTH);
		progressBar.setStringPainted(true);	//设置进度条上显示数字	
		Thread t = new Thread(new Runnable(){
		int count = 0; public void run() {
		while (true){
			progressBar.setValue(++count);//设置进度条的当前值
		try{ 
			Thread.sleep(100);	//使线程休眠 100毫秒	
		} catch (InterruptedException e){//捕捉InterruptedException 异常
			System.out.println("当前线程序被中断"); 
			break;}
		}
		}
		}
		);
		button.addActionListener(new ActionListener(){
		@Override
		public void actionPerformed(ActionEvent e){
		t.interrupt();	//中断线程	
		}
		});	t.start();	//启动线程	
		}
		public static void init(JFrame frame, int width, int height) {
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(width, height); frame.setVisible(true);
		}
 
		public static void main(String[] args){
		init(new InterruptedSwing(),100,100);
		
	}
 
}

20.4.4 线程的礼让


Thread 类中提供了一种礼让方法,使用 yield0方法表示,它只是给当前正处于运行状态的线程个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
yield0方法使具有同样优先级的线程有进入可执行状态的机会,在当前线程放弃执行权时会再度回到就绪状态。对于支持多任务的操作系统来说,不需要调用 yield0方法,因为操作系统会为线程自动分配CPU 时间片来执行

20.5 线程的优先级


每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态。但这并不意味着低优先的线程得不到运行,而只是它运行的概率比较小,如垃圾回收线程的优先级就较低。
Thread 类中包含的成员变量代表了线程的某些优先级,如 Thread.MIN_PRIORITY (常数 1)Thread.MAX PRIORITY(常数 10)、Thread.NORM_PRIORITY (常数 5)。其中,每个线程的优先级在 ThreadMIN PRIORITY~Thread.MAX_PRIORITY,在默认情况下其优先级都是 ThreadNORMPRIORITY。每个新产生的线程都继承了父线程的优先级。
在多任务操作系统中,每个线程都会得到一小段 CPU 时间片运行,在时间结束时,将轮换另-个线程进入运行状态,这时系统会选择与当前线程优先级相同的线程予以运行。系统始终选择就绪状态下优线程B先级较高的线程进入运行状态。

20.6 线程同步


禅线程程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,
是如果使用多线程程序,就会发生两个线程抢占资源的问题,如两个人同时说话、两个人同时过同个独木桥等。所以,在多线程编程中需要防止这些资源访问的冲突。Java 提供了线程同步的机制来止资源访问的冲突。
20.6.1线程安全
实际开发中,使用多线程程序的情况很多,如银行排号系统、火车站售票系统等。这种多线程的程序通常会发生问题,以火车站售票系统为例,在代码中判断当前票数是否大于 0,如果大于0则执行将该票出售给乘客的功能,但当两个线程同时访问这段代码时(假如这时只剩下一张票),第一个线将票售出,与此同时第二个线程也已经执行完成判断是否有票的操作,并得出票数大于 0 的结论,于是它也执行售出操作,这样就会产生负数。所以,在编写多线程程序时,应该考虑到线程安全问题实质上线程安全问题来源于两个线程同时存取单一对象的数据。


20.6.2 线程同步机制


那么,该如何解决资源共享的问题呢?所有解决多线程资源冲突问题的方法基本上都是采用给定时间只允许一个线程访问共享资源的方法,这时就需要给共享资源上一道锁。这就好比一个人上洗手间时,他进入洗手间后会将门锁上,出来时再将锁打开,然后其他人才可以进入。
1.同步块
Java 中提供了同步机制,可以有效地防止资源冲突。同步机制使用 synchronized 关键字,使用该关键字包含的代码块称为同步块,也称为临界区,语法如下:

package 二十章;

public class ThreadSafeTest implements Runnable{
	int num=10;
	public synchronized void doit(){
	while(true) {
	if(num>0) {
		try {
			Thread.sleep(100);
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"----票数"+num--);
	}
	}
	}
	public void run() {
		while(true) {
		doit();
		}
	}
	public static void main(String[] args) {
		ThreadSafeTest t=new ThreadSafeTest();
		Thread tA=new Thread(t,"线程一");
		Thread tB=new Thread(t,"线程二");
		Thread tC=new Thread(t,"线程三");
		Thread tD=new Thread(t,"线程四");
		tA.start();
		tB.start();
		tC.start();
		tD.start();
	}

}

 

从这个结果可以看出,打印到最后票数没有出现负数,这是因为将共享资源放置在了同步块中不管程序如何运行都不会出现负数。
2、同步方法
同步方法就是在方法前面用synchronized 关键字修饰的方法,其语法如下:
synchronized void f0
当某个对象调用了同步方法时,该对象上的其他同步方法必须等待该同步方法执行完毕后才董获行。必须将每个能访问共享资源的方法修饰为 synchronized,否则就会出错。修改剑20.7的代码,将共享资源操作放置在一个同步方法中,代码如下:
 

raum=10public synchronized void doit() {
//定义同步方法

}

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

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

相关文章

配置主机与外网时间服务器同步时间

目录 NTP服务简介 时间管理命令 第一步:更改当前主机所在地的时间 方法一:使用tzselect命令查询需要的时区 1、使用tzselect命令查询需要的时区 2、添加变量到 ~/.bash_profile 文件中,即追加类似的内容: 3、重新连接一个…

Flink(九)【时间语义与水位线】

前言 2023-12-02-20:05,终于写完啦,最近状态不错。刚写完又收到了她的消息哈哈哈哈,开心。 再去全力打拼一次,奋战一场,就算最后打了败仗也无所谓,至少你留下了足迹。 《解忧杂货店》 1、时间语义 …

团队git操作流程

项目的开发要求:(1)项目组厉员代码提交不少于20次 (2)项目组厉员每天提交不少于20次 (3)企业项目开发代码的每天的提交一般提交3-5次 (4)代码仓库的管理 git的基础操作流…

【CSP】202305-1_重复局面Python实现

文章目录 [toc]试题编号试题名称时间限制内存限制题目背景问题描述输入格式输出格式样例输入样例输出样例说明子任务提示Python实现 试题编号 202305-1 试题名称 重复局面 时间限制 1.0s 内存限制 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3…

会声会影2024软件还包含了视频教学以及模板素材

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能,用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材,让用户剪辑视频更加的轻松。 会…

【Linux 进度条小程序】缓冲区+回车换行

文章目录 回车与换行缓冲区举个栗子fflush函数倒计时小程序进度条小程序 回车与换行 回车和换行是不同的两个概念 回车:\r 使光标回到本行行首。 换行:\n使光标下移一格。 一般我们的键盘上的Enter键是回加换行键 在c语言中 \n 表示回车换行 效果和Ent…

iNet Network Scanner for Mac:简洁高效的WiFi网络扫描软件

随着无线网络的普及,WiFi网络已经成为我们日常生活中必不可少的一部分。无线网络的稳定性和速度对我们的工作和娱乐体验至关重要。因此,一款功能强大、简洁高效的WiFi网络扫描软件非常重要。今天,我们向大家推荐一款优秀的Mac平台WiFi网络扫描…

AI生成工具助力业界,黎万强投资。/微信支付和支付宝境外银行卡全面支持 | 魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 🔥资讯预览 AI应用一年半,IBM HR部省12000小时 华为沉默中,何时…

提高工厂能源效率的关键:工厂能耗监测平台

工业做为能源消耗的重要场所,所以节能减排对工业来讲是一个亟需解决的问题。除了对设备进行更新换代外,还需要能源管理消耗监测平台,帮助企业实现节能减排的目标。 工厂能源消费量非常庞大,能源比较难以监测与控制。传统能源的管…

《微信小程序开发从入门到实战》学习四十二

4.3 云开发文件存储 文件存储功能支持将任意数量和格式的文件(如图片和视频)保存在云端,支持 以文件夹的形式将文件归类。 在云开发控制台中,可以对云端保存的文件进行管理。 也可以通过文件存储API对文件进行上传、删除、移动…

每日股票价格 - 华为机试真题题解

每日股票价格 - 华为机试真题题解 题目描述 ​ 给定某只股票连续N天的价格列表stockPrices,其中stockPricesi表示股票某天的价格,请生成一个新列表,对应位置输出为:要想等到股票价格上涨,至少需要等待的天数,如果股票…

一个容器中填值,值太多不换行,而是调小字体大小和行高

<!-- clampLineHeight 重计算行高 --> <!-- clampTextSize 重计算字体大小 --> <!-- 这里的div高8mm, 宽6cm, 文本为text --> <div style"height:8mm;width:6cm;text-align:left"><span :style"{ fontSize: clampTextSize(text, 6cm…

Redis——某马点评day03——part2:秒杀业务异步优化

异步秒杀思路 原本的流程是如下所示&#xff0c;必须从开始到创建订单成功才会返回响应。就像饭店里面从下单到上菜都是一个人在服务&#xff0c;就导致服务员利用率很低&#xff0c;后一个顾客要等到前一个顾客上完菜才可以下单。 最简单的优化就是加员工&#xff0c;一次性…

基于单片机自动饮料混合机控制系统设计

**单片机设计介绍&#xff0c;基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目&#xff0c;包括单片机技术、传感器技术…

开发者的福音:TinyVue 组件库文档大优化!类型更详细,描述更清晰!

你好&#xff0c;我是 Kagol。 前言 从今年2月份开源以来&#xff0c;有不少朋友给我们 TinyVue 组件库提了文档优化的建议&#xff0c;这些建议都非常中肯&#xff0c;我们也在持续对文档进行优化&#xff0c;并且从中总结出了大家对于文档优化的一些共性问题&#xff0c;形…

redis应用-分布式锁

目录 什么是分布式锁 分布式锁的基本实现 引入过期时间 引入校验id 引入lua 引入看门狗 引入redlock算法 什么是分布式锁 在一个分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于"线程安全"的问题. 而…

Vis.js教程(三):设置关系图的节点关系指向

1、引言 在 Vis.js教程&#xff08;一&#xff09;基础关系图中&#xff0c;我们介绍了基础关系图的创建&#xff0c;以及关系图的简单样式修改。 这一节我们介绍如何给关系图添加节点之间的关系指向。 2、关系指向添加 // create an array with edgesconst edges new vis…

线上项目修改最后一招 修改jar中的文件并重新打包成jar

解压jar包 在要操作的jar文件上边cmd打开命令提示符窗口&#xff08;windows系统&#xff09;&#xff0c; 在cmd命令下执行 jar -xvf xxx.jar 解压jar包&#xff08;其中xxx.jar换成你的jar包名&#xff09; jar -xvf admin-1.0.0.jar 替换或者更改操作 如果要替换jar压缩…

【Redis】Redis的内部设计与实现

Redis的设计、实现 数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,…

K-Radar:适用于各种天气条件的自动驾驶4D雷达物体检测

文章&#xff1a;K-Radar: 4D Radar Object Detection for Autonomous Driving in Various Weather Conditions 作者&#xff1a;Dong-Hee Paek&#xff0c; Seung-Hyun Kong&#xff0c;Kevin Tirta Wijaya 编辑&#xff1a;点云PCL 代码&#xff1a;https://github.com/ka…