二十章 多线程

线程简介


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

创建线程

继承Thread 类


        Thread 类时 java.lang 包中的一个类,从类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。

继承 Thread 类创建一个新的线程的语法如下:

public class ThreadTest extends Thread{
}

Thread 对象需要一个任务来执行,任务是指线程在启动时执行的工作,该工作的功能代码被写在

run()方法中。run()方法必须使用以下语法格式:

public void run(){
}

主方法线程自动由 Java虚拟机负责,程序员负责启动自己的线程。代码如下:

public static void main(Stringl args) {
new ThreadTest().start();

}

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

 
  1. public class ThreadTest extends Thread{
    
    public void run() {
    
    for(int i=0;i<=10;i++) {
    
    System.out.print(i+" ");
    
    }
    
    }
    
    
    public static void main(String[] args) {
    
    ThreadTest t=new ThreadTest();
    
    t.start();
    
    }
    
    }

 

实现 Runnable 接口


        线程都是通过扩展 Thread 类来创建的,如果程序员需要继承其他类(非Thread 类),而且还要是当前类实现多线程,那么可以通过  Runnable 接口来实现。

        实现 Runnable 接口的程序会创建一个 Thread 对象,并将 Runnable 对象与 Thread 对象相关联。

使用 Runnable 接口启动新的线程的步骤:

建立 Runnable 对象
使用参数为 Runnable 对象的构造方法创建 Thread 实例
调用 start() 方法启动线程


例:让窗体的图标动起来
 

 
  1. 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,250,100);//绝对定位窗体大小与位置
    
    Container cotainer=getContentPane();//主容器
    
    cotainer.setLayout(null);//使窗体不使用任何布局管理器
    
    
    Icon icon=new ImageIcon("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>=120) {
    
    count=10;//当图标到达标签的最右时,时其回到标签做左边
    
    }
    
    }
    
    
    }
    
    };
    
    t.start();//启动线程
    
    cotainer.add(jl);//将标签添加到容器中
    
    setVisible(true);//使窗体可见
    
    setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体的关闭方式
    
    }
    
    
    public static void main(String[] args) {
    
    new SwingAndThread();
    
    
    }
    
    }

 

线程的生命周期


        一旦线程进入可执行状态,它会在就绪与运行状态下转换,同时也有可能进入等待,休眠,赌塞或死亡状态。

要使线程处于就绪,有以下几种方法:

调用 sleep() 方法。
调用 wait() 方法。
等待输入/输出完成。


当线程处于就绪状态后,可以用以下几种方法使线程再次进入运行状态:

线程调用 notify() 方法。
线程调用 notifyAll() 方法。
线程调用 interrupt() 方法。
线程的休眠时间结束。
输入/输出结束。


操作线程的方法


 线程的休眠


        一种能控制线程行为的方法是调用 sleep() 方法需要一个参数用于指定该线程休眠的时间,该时间以毫秒为单位。

例:每0.1秒绘制一条随机颜色的线条
 

 
  1. import java.awt.Color;
    
    import java.awt.Graphics;
    
    import java.util.Random;
    
    
    import javax.swing.JFrame;
    
    
    public class SleepMethodTest extends JFrame{
    
    private static Color[] color= {Color.BLACK,Color.BLUE,Color.CYAN,Color.GREEN,
    
    Color.RED,Color.ORANGE,Color.YELLOW,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);//线程休眠0.1秒
    
    }catch(InterruptedException e) {
    
    e.printStackTrace();
    
    }
    
    Graphics graphics=getGraphics();//获取组件绘图上下文对象
    
    graphics.setColor(getC());//设置绘图颜色
    
    graphics.drawLine(x, y,150, y++);//绘制直线并递增垂直坐标
    
    if(y>=180) {
    
    y=50;
    
    }
    
    }
    
    }
    
    });
    
    t.start();//启动线程
    
    }
    
    
    public static void main(String[] args) {
    
    init(new SleepMethodTest(),200,200);
    
    
    }
    
    
    public static void init(JFrame frame,int width,int height) {//初始化程序界面的方法
    
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    frame.setSize(width, height);
    
    frame.setVisible(true);
    
    }
    
    }

 

线程的加入

        当某个线程使用 join() 方法的加入一个线程时,另外一个线程会等待该线程执行完毕后再继续执行。

代码:

 
  1. 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 porgressBar=new JProgressBar();
    
    private JProgressBar porgressBar2=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(porgressBar,BorderLayout.NORTH);//将进度条设置在窗体最北面
    
    getContentPane().add(porgressBar2,BorderLayout.SOUTH);//将进度条设置在窗体最南面
    
    //设置进度条显示数字字符
    
    porgressBar.setStringPainted(true);
    
    porgressBar2.setStringPainted(true);
    
    //使用匿名内部类形式初始化 Thread 实例
    
    threadA=new Thread(new Runnable() {
    
    int count=0;
    
    public void run() {//重写 run()方法
    
    while(true) {
    
    porgressBar.setValue(++count);//设置进度条的当前值
    
    try {
    
    Thread.sleep(100);//使线程A休眠100毫秒
    
    threadB.join();//使线程B调用join()方法
    
    }catch(InterruptedException e) {
    
    e.printStackTrace();
    
    }
    
    }
    
    }
    
    });
    
    threadA.start();//启动线程A
    
    threadB=new Thread(new Runnable() {
    
    int count=0;
    
    public void run() {
    
    while(true) {
    
    porgressBar2.setValue(++count);//设置进度条的当前值
    
    try {
    
    Thread.sleep(100);//使线程休眠100毫秒
    
    }catch(InterruptedException e) {
    
    e.printStackTrace();
    
    }
    
    if(count==100)//当count变量增长为100时
    
    break;//跳出循环
    
    }
    
    }
    
    });
    
    threadB.start();//启动线程B
    
    }
    
    
    }

 

线程的中断


        以往有时候会使用 stop() 方法停止线程,但当前版本的 JDK 早已废除了 stop() 方法,不建议使用 stop() 方法来停止一个线程的运行。现在提倡在 run() 方法中使用无限循环的形式,然后使用一个布尔型标记控制循环的停止。

        如果线程是因为使用了 sleep()或 wait()方法进入了就入就绪状态,可以使用 Thread()方法,同时程序破除了 InterruptedException 异常,在异常处理时结束了 while 循环。在项目中,经常在这里执行关闭数据连接和关闭 Socket 连接等操作。

 代码: 
 

 
  1. import java.awt.BorderLayout;
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    
    
    import javax.swing.JButton;
    
    import javax.swing.JFrame;
    
    import javax.swing.JProgressBar;
    
    
    public class InterruptedSwing extends JFrame{
    
    
    public InterruptedSwing (){
    
    JProgressBar porgressBar=new JProgressBar();//创建进度条
    
    getContentPane().add(porgressBar,BorderLayout.NORTH);//将进度条设置在窗体最北面
    
    JButton button=new JButton("停止");
    
    getContentPane().add(button,BorderLayout.SOUTH);//将进度条设置在窗体最北面
    
    //设置进度条显示数字字符
    
    porgressBar.setStringPainted(true);
    
    //使用匿名内部类形式初始化 Thread 实例
    
    Thread t=new Thread(new Runnable() {
    
    int count=0;
    
    
    public void run() {//重写 run()方法
    
    while(true) {
    
    porgressBar.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);
    
    
    }
    
    }

 

线程的礼让


         Thread 类提供了一种礼让方法,使用 yied()方法表示,它只是给当前正处于运行状态的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。

        yied()方法使具有同样优先级的线程有进入可执行状态的机会,在当前线程放弃执行权时再度回到就绪状态。对于支持多任务的操作系统来说,不需要调用 yied()方法,因为操作系统会为线程自动分配 CPU 时间来执行。

线程的优先级


        每个线程都具有各自的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态。但这并不意味着低优先级的线程得不到运行,而只是它运行的概率比较小,如垃圾回收线程的优先级就按照较低。

        线程的优先级可以使用 setPriority()方法调整,如果使用该方法设置的优先级不在 1~10,将产生IllegalArgumentException 异常。

代码: 
 

 
  1.  

    public class PriorityTest implements Runnable{
    
    String name;
    
    
    public PriorityTest(String name) {
    
    this.name=name;
    
    }
    
    
    @Override
    
    public void run() {
    
    String tmp="";
    
    for(int i=0;i<5000;i++) {
    
    tmp+=i;//完成5万次字符串拼接
    
    }
    
    System.out.println(name+"线程完车任务");
    
    }
    
    
    public static void main(String[] args) {
    
    Thread a=new Thread(new PriorityTest("A"));
    
    a.setPriority(1);//A线程优先级最小
    
    Thread b=new Thread(new PriorityTest("B"));
    
    b.setPriority(3);
    
    Thread c=new Thread(new PriorityTest("C"));
    
    c.setPriority(7);
    
    Thread d=new Thread(new PriorityTest("D"));
    
    d.setPriority(10);//D线程优先级最大
    
    a.start();
    
    b.start();
    
    c.start();
    
    d.start();
    
    }
    
    }

 

线程同步


        在单线程程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,但是如果使用多线程程序,就会发生两个线程抢占资源的问题,如两个人同事说话、两个人同时过同一个独木桥。所以,在多线程编程中需要防止这些资源访问的冲突。Java 提供了线程同步的机制来防止资源访问的冲突。

线程安全


        在编写多线程时时,因该考虑到线程安全问题。实质上线程问题来源两个线程同时存取单一对象的数据。

代码: 

 
  1.  

    public class ThreadSafeTest implements Runnable{
    
    int num = 10; //设置当前票数
    
    
    
    @Override
    
    public void run() {
    
    while(true) { //设置无限循环
    
    if(num >0) { //设置当前票数是否大于0
    
    try {
    
    Thread.sleep(100); //使当前线程休眠100毫秒
    
    }catch(InterruptedException e) {
    
    e.printStackTrace();
    
    }
    
    System.out.println(Thread.currentThread().getName()+"------票数"+num--); //票数减一
    
    }
    
    }
    
    }
    
    
    public static void main(String[] args) {
    
    ThreadSafeTest t = new ThreadSafeTest(); //实例化类对象
    
    Thread tA = new Thread(t,"线程一"); //以该类对象分别实例化4个线程
    
    Thread tB = new Thread(t,"线程二");
    
    Thread tC = new Thread(t,"线程三");
    
    Thread tD = new Thread(t,"线程四");
    
    tA.start(); //分别启动线程
    
    tB.start();
    
    tC.start();
    
    tD.start();
    
    }
    
    }

线程同步机制


        所以解决多线程资源问题的方法基本上都是采用给定时间只允许一个线程访问共享资源的方法。这时就需要给共享源上一道锁。

1、同步块


        Java中提供了同步机制,可以有效地防止资源冲突。同步机制使用 synchronized 关键字,使用该关键字包含的代码块称为同步块,也称临界区,语法如下:

synchronized(Object){
}

代码: 
 

 
  1.  

    public class ThreadSafeTest implements Runnable{
    
    int num = 10; //设置当前票数
    
    
    
    @Override
    
    public void run() {
    
    while(true) { //设置无限循环
    
    synchronized(this) { //同步锁
    
    if(num >0) { //设置当前票数是否大于0
    
    try {
    
    Thread.sleep(100); //使当前线程休眠100毫秒
    
    }catch(InterruptedException e) {
    
    e.printStackTrace();
    
    }
    
    System.out.println(Thread.currentThread().getName()+"------票数"+num--); //票数减一
    
    }
    
    }
    
    }
    
    }
    
    public static void main(String[] args) {
    
    ThreadSafeTest t = new ThreadSafeTest(); //实例化类对象
    
    Thread tA = new Thread(t,"线程一"); //以该类对象分别实例化4个线程
    
    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 f(){

}

 
  1.  

    public class ThreadSafeTest implements Runnable{
    
    int num = 10; //设置当前票数
    
    public synchronized void doit() { //定义同步方法
    
    if(num >0) { //设置当前票数是否大于0
    
    try {
    
    Thread.sleep(10); //使当前线程休眠100毫秒
    
    }catch(InterruptedException e) {
    
    e.printStackTrace();
    
    }
    
    System.out.println(Thread.currentThread().getName()+"------票数"+num--); //票数减一
    
    }
    
    }
    
    
    @Override
    
    public void run() {
    
    while(true) { //设置无限循环
    
    doit(); //在run()方法中调用该同步方法
    
    }
    
    }
    
    
    public static void main(String[] args) {
    
    ThreadSafeTest t = new ThreadSafeTest(); //实例化类对象
    
    Thread tA = new Thread(t,"线程一"); //以该类对象分别实例化4个线程
    
    Thread tB = new Thread(t,"线程二");
    
    Thread tC = new Thread(t,"线程三");
    
    Thread tD = new Thread(t,"线程四");
    
    tA.start(); //分别启动线程
    
    tB.start();
    
    tC.start();
    
    tD.start();
    
    }
    
    }

运行结果: 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目中的svg图标的封装与使用

1.安装 npm install vite-plugin-svg-icons -D2.在vite.config.ts中配置 **所有的svg图标都必须放在assets/icons // 引入svg import { createSvgIconsPlugin } from vite-plugin-svg-iconsexport default defineConfig({plugins: [vue(),createSvgIconsPlugin({iconDirs: [p…

PWM 正玄波形 通过C语言生成

#include <stdio.h> #include <math.h> #include <stdint.h>#define SAMPLE_POINT_NUM (200) /* 需要生成的点的个数 */ #define SINE_MAX (255) /* sin 函数幅值 */ #define PI (3.14…

共享充电宝被取代,共享WIFI项目将成市场趋势!

在创业领域如果有这样一个项目&#xff0c;你会选择哪一个&#xff1f;前者投资十万风险大&#xff0c;后者投资几千风险小。同样需要扫街地推&#xff0c;但产生的利润是相同的。相信100%的人会选择后者。实际上这两个项目前者就是共享电宝&#xff0c;后者就是共享WiFi项目。…

ground truth 在深度学习任务中代表的是什么意思?

1、概念 在深度学习领域&#xff0c;ground truth (中文意思是“地面真实值”或“基准真实值”&#xff0c;简单理解就是真实值) 是指用于训练和评估模型的准确标签或数据。它是机器学习算法的参考标准&#xff0c;用于衡量模型的性的和判断模型的准确性&#xff0c;本文将介绍…

【傻瓜级JS-DLL-WINCC-PLC交互】4.DLL读取WINCC内部变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

一名技术Leader应该是创作者

今天看了一本书叫做《黑客与画家》。它里面提到一个很重要的概念就是黑客&#xff08;优秀的程序员&#xff09;是一名建筑师&#xff0c;而不是一名工程师。 传统的主管和互联网的Leader 这两者有什么区别呢&#xff1f;关键点在于建筑师是思考做什么&#xff0c;而工程师是…

数据结构(超详细讲解!!)第二十五节 树与森林

1.树的存储结构 和线性表一样&#xff0c;树可以用顺序和链式两种存储结构。 树的顺序存储结构适合树中结点比较“满”的情况。根据树的非线性结构特点&#xff0c;常用链式存储方式来表示树。树常用的存储方法有&#xff1a;双亲表示法、孩子表示法和孩子兄弟表…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…

SpringSecurity+JWT实现权限控制以及安全认证

一.简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户​ 授权&…

虚幻学习笔记3—UI跟随弹窗

一、前言 本文使用的虚幻引擎5.3.2&#xff0c;继点击场景3D物体的两种处理方式的基础完成对3D物体的点击触发后&#xff0c;我们需要制作一个可以弹窗显示该物体信息的UI面板&#xff0c;同时保证弹窗可以跟随物体。另外还讲了一种UI上的悬浮提示跟随弹窗。 二、实现 2.1、创…

Pytorch:torch.utils.data.DataLoader()

如果读者正在从事深度学习的项目&#xff0c;通常大部分时间都花在了处理数据上&#xff0c;而不是神经网络上。因为数据就像是网络的燃料&#xff1a;它越合适&#xff0c;结果就越快、越准确&#xff01;神经网络表现不佳的主要原因之一可能是由于数据不佳或理解不足。因此&a…

ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

近年来&#xff0c;由于社会经济的快速发展和人口增长&#xff0c;社会活动对环境的压力不断增大&#xff0c;人地矛盾加剧。虽然全球各国在生态环境的建设和保护上已取得不少成果&#xff0c;但还是未从根本上转变生态环境的恶化趋势&#xff1b;生态破坏、环境退化、生物多样…

rss服务搭建记录

layout: post title: RSS subtitle: vps搭建RSS服务 date: 2023-11-27 author: Sprint#51264 header-img: img/post-bg-universe.jpg catalog: true tags: - 折腾 文章目录 引言RSShub-dockerRSS-radarFreshrssFluent reader获取fever api配置Fluent Reader同步 结语 引言 一个…

【代码】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法matlab/yalmip+cplex/gurobi

程序名称&#xff1a;数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;数据驱动的分布鲁棒优化算法。考虑四个离散场景&#xff0c;模型采用列与约束生成(CCG)算法进行迭代求解&#xff0c;场景分…

C#键盘钩子(Hook)拦截器的使用

引言 键盘钩子(Hook)是一种机制&#xff0c;允许程序捕获和处理操作系统中的键盘输入。在C#中&#xff0c;我们可以使用键盘钩子来创建一个拦截器&#xff0c;用于拦截特定的键盘事件并执行自定义操作。本文将介绍如何使用C#开发一个键盘钩子拦截器&#xff0c;并给出一些示例代…

苹果手机如何格式化?五个步骤快速掌握!

如果手机出现异常情况&#xff0c;例如运行缓慢、频繁崩溃&#xff0c;又或者想将手机出售、转让给他人&#xff0c;那么将手机格式化可以有助于解决问题。苹果手机如何格式化&#xff1f;本文将为您介绍解决方法&#xff0c;只需要五个步骤就能搞定&#xff0c;帮助您快速掌握…

一维数组,逆序存放并输出【样例输入】20 30 10 50 40 90 80 70【样例输出】70 80 90 40 50 10 30 20

一维数组&#xff0c;逆序存放并输出 【样例输入】 20 30 10 50 40 90 80 70 【样例输出】 70 80 90 40 50 10 30 20 以下是使用C语言编写的将一维数组逆序存放并输出的示例代码&#xff1a; #include <stdio.h>void reverseArray(int arr[], int size) {int start…

Xilinx Zynq-7000系列FPGA多路视频处理:图像缩放+视频拼接显示,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解HLS 图像缩放介绍Video Mixer介绍 4、vivado工程介绍PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他…

全网日志智能聚合及问题根因分析

1 日志关联分析的挑战 随着各行各业数字化转型的不断深入&#xff0c;网络承载了人们日常生活所需的政务、金融、娱乐等多方面的业务系统&#xff0c;已经成为影响社会稳定运行、关系国计民生的重要基础设施资源。哪怕网络发生及其微小的故障&#xff0c;也可能带来难以估量的…

【预测爆款不用愁,有服饰RFID小助手】

时尚服饰行业库存成本高&#xff0c;数据不精准&#xff0c;爆款服饰一直抓不住&#xff0c;增加库存滞销风险难脱逃&#xff0c;给服饰零售企业带来极大困扰。 帮您提前预测爆款服饰小塔服饰RFID系统 小塔RFID系统作为服饰新零售小助手&#xff0c;通过RFID系统与硬件结合&a…