《智能仿真无人机平台(多线程V1.0)技术笔记》(初识线程,带你理解程序运行的基本流程)

智能仿真无人机平台(多线程V1.0)技术笔记

一、核心前置知识

1. 基础依赖

  • Java语法:数据类型、输入输出、变量、运算符、条件判断、循环语句、数组
  • 数据结构:数组、链表、队列、栈、线性表、集合、哈希表
  • 面向对象:类与对象、继承、封装、接口、泛型
  • 计算机基础:操作系统、计算机组成原理、JVM(Java虚拟机)

2. 进程与线程核心概念

  • 程序:磁盘中的文件(代码+数据),静态存在,无法直接解决问题。
  • 进程:正在运行的程序(代码+数据加载到内存),是操作系统分配资源的最小单元,可调度CPU/RAM/IO。
  • 线程:进程的组成部分,是CPU分配执行任务的最小单元,进程内多线程可共享数据,一个进程至少包含一个线程。

二、Java实现多线程的三种方式

1. 继承Thread类

  • 步骤:
  1. 定义类继承 Thread ;
  2. 重写 run() 方法(存放线程独立执行的代码);
  3. 创建类对象,调用 start() 方法启动线程(不可重复调用)。
  • 示例代码:
java 复制代码
  
package com01.zyf0120;
public class MyThread extends Thread {
    String name;
    public MyThread(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(name + "--" + i);
        }
    }
}

2. 实现Runnable接口(推荐优先使用)

  • 步骤:
  1. 定义类实现 Runnable 接口;
  2. 重写 run() 方法(编写线程执行逻辑);
  3. 创建接口实现类对象,传入 Thread 构造器;
  4. 调用 Thread 对象的 start() 方法启动。
  • 示例代码:
java 复制代码
  
package com01.zyf0120;
public class MyRun implements Runnable {
    String name;
    int count = 0;
    public MyRun(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            count++;
            System.out.println(name + "--" + i);
        }
        System.out.println("count: " + count);
    }
}

3. 实现Callable接口(补充方式)

  • 核心特点:支持返回结果和抛出异常,其余实现逻辑与Runnable类似(需结合FutureTask使用)。

4. 线程启动主类示例

java 复制代码
  
package com01.zyf0120;
public class Main {
    public static void main(String[] args) {
        // 继承Thread方式启动
        MyThread mt1 = new MyThread("线程A");
        MyThread mt2 = new MyThread("线程B");
        mt1.start();
        mt2.start();

        // 实现Runnable方式启动
        MyRun mr1 = new MyRun("线程C");
        Thread t1 = new Thread(mr1);
        Thread t2 = new Thread(mr1);
        t1.start();
        t2.start();
    }
}

三、继承Thread类与实现Runnable接口的区别

  • 继承Thread:受Java单继承限制,线程与任务耦合。
  • 实现Runnable:无继承限制,线程与任务解耦,多个Thread可共享一个Runnable实例(实现数据共享)。

四、线程生命周期

  • 核心流程:创建 → 运行 → 结束,一个线程周期内仅能调用一次 start() 方法。

五、实战应用:智能无人机多线程案例

1. 功能说明

通过多线程实现无人机在UI界面的自主移动,利用Thread子类处理绘图与运动逻辑,实现双无人机独立运动。

2. 核心代码

(1)UI窗口类(DroneUI)

java 复制代码
  
package com01.zyf0120.dronev1;
import javax.swing.JFrame;
import java.awt.Graphics;

public class DroneUI extends JFrame {
    public DroneUI() {
        setTitle("智能无人机平台");
        setSize(800, 700);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
        Graphics g = this.getGraphics();
        DroneThread dt = new DroneThread(g);
        dt.start(); // 启动无人机运动线程
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); // 刷新窗体
    }

    public static void main(String[] args) {
        new DroneUI();
    }
}

(2)无人机运动线程类(DroneThread)

java 复制代码
  
package com01.zyf0120.dronev1;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class DroneThread extends Thread {
    Graphics g;
    int x = 400, y = 300; // 无人机1初始坐标
    int speedx = 2, speedy = 2; // 无人机1速度
    int x1 = 100, y1 = 100; // 无人机2初始坐标
    int speedx1 = 1, speedy1 = 1; // 无人机2速度

    public DroneThread(Graphics g) {
        this.g = g;
    }

    public void setPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public void run() {
        while (true) { // 无限循环实现持续运动
            BufferedImage img = new BufferedImage(800, 700, BufferedImage.TYPE_INT_ARGB);
            Graphics bg = img.getGraphics();
            bg.setColor(Color.WHITE);
            bg.fillRect(0, 0, 800, 700); // 绘制白色背景

            // 绘制两架无人机
            drawDrone(bg, x, y, speedx, speedy);
            drawDrone(bg, x1, y1, speedx1, speedy1);

            g.drawImage(img, 0, 0, null); // 渲染到UI窗口

            // 边界碰撞检测(反弹逻辑)
            if (x > 600 || x < 0) speedx = -speedx;
            if (y > 500 || y < 0) speedy = -speedy;
            if (x1 > 600 || x1 < 0) speedx1 = -speedx1;
            if (y1 > 500 || y1 < 0) speedy1 = -speedy1;

            // 更新坐标
            x += speedx;
            y += speedy;
            x1 += speedx1;
            y1 += speedy1;

            try {
                Thread.sleep(1); // 控制运动速度
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    // 绘制无人机(三层圆形组合)
    public void drawDrone(Graphics bg, int x, int y, int speedx, int speedy) {
        bg.setColor(new Color(0, 0, 255, 60));
        bg.fillOval(x, y, 200, 200); // 外层蓝色透明圆
        bg.setColor(new Color(64, 195, 66));
        bg.fillOval(x + 70, y + 70, 60, 60); // 中层绿色圆
        bg.setColor(new Color(255, 0, 0));
        bg.fillOval(x + 85, y + 85, 30, 30); // 内层红色圆
    }
}

add版本:

添加的无人机发现敌人会输出语句的效果

java 复制代码
package duoxiancheng.xq0120.dronev1;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

/**
 * @author xuqiang
 * @date 2026/1/22  14:13
 * @description
 */
public class newadd extends Thread{
    Graphics g;
    int x=400,y=300;
    int speedx =2,speedy =2;
    int x1=100,y1=100;
    int speedx1 =1,speedy1 =1;
    private boolean enemyDetectedByDrone1 = false;
    private boolean enemyDetectedByDrone2 = false;
    int count1 = 0;
    int count2 = 0;



    public newadd(Graphics g){
        this.g=g;
    }

    public void setPoint(int x,int y){
        this.x=x;
        this.y=y;
    }

    public void run() {
        while (true) {
            BufferedImage img = new BufferedImage(800, 700, BufferedImage.TYPE_INT_ARGB);
            Graphics bg = img.getGraphics();
            bg.setColor(Color.WHITE);
            bg.fillRect(0, 0, 800, 700);

            drawDrone(bg, x, y, speedx, speedy);
            drawDrone(bg,x1,y1,speedx1,speedy1);
            drawenemy(bg);

            boolean isDrone1InArea = (x < 375 && x + 200 > 425 && y < 325 && y + 200 > 475);
            if (isDrone1InArea && !enemyDetectedByDrone1) {
                System.out.println("无人机1发现敌人!");
                count1++;
                enemyDetectedByDrone1 = true;
                System.out.println("无人机1发现"+count1+"次敌人");
            } else if (!isDrone1InArea && enemyDetectedByDrone1) {
                enemyDetectedByDrone1 = false;
            }

            // --- 无人机2的检测逻辑 ---
            boolean isDrone2InArea = (x1 < 375 && x1 + 200 > 425 && y1 < 325 && y1 + 200 > 475);
            if (isDrone2InArea && !enemyDetectedByDrone2) {
                System.out.println("无人机2发现敌人!");
                count2++;
                enemyDetectedByDrone2 = true;
                System.out.println("无人机2发现"+count2+"次敌人");
            } else if (!isDrone2InArea && enemyDetectedByDrone2) {
                enemyDetectedByDrone2 = false;
            }

            g.drawImage(img,0,0,null);

            if(x>600 || x<0) speedx = -speedx;
            if(y>500 || y<0) speedy = -speedy;
            if(x1>600 || x1<0) speedx1 = -speedx1;
            if(y1>500 || y1<0) speedy1 = -speedy1;


            x+=speedx;
            y+=speedy;
            x1+=speedx1;
            y1+=speedy1;

            try{
                Thread.sleep(1);
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
        }
    }
    public void drawDrone(Graphics bg,int x,int y,int speedx,int speedy){
        bg.setColor(new Color(0, 0, 255, 60));
        bg.fillOval(x, y, 200, 200);
        bg.setColor(new Color(29, 129, 34));
        bg.fillOval(x + 70, y + 70, 60, 60);
        bg.setColor(new Color(255, 0, 0));
        bg.fillOval(x + 85, y + 85, 30, 30);
    }

    public void drawenemy(Graphics bg){
        bg.setColor(new Color(245, 180, 84));
        bg.fillRect(375,325,50,50);
    }
}
相关推荐
进阶小白猿2 小时前
Java技术八股学习Day23
java·网络·学习
砚边数影2 小时前
DL4J框架入门(三):基础配置,计算后端(CPU/GPU)选型与优化
java·数据库·人工智能·ai·金仓数据库
名字无法显示3412 小时前
Arthas 实战指南:结合 IDEA 的 Java 线上排查完整流程
java·intellij-idea
qq_12498707532 小时前
基于Spring Boot的桶装水配送管理系统的设计与实现(源码+论文+部署+安装)
java·前端·spring boot·后端·spring·毕业设计·计算机毕业设计
季明洵2 小时前
二分搜索、移除元素、有序数组的平方、长度最小的子数组
java·数据结构·算法·leetcode
leiming62 小时前
C语言联合体union的用法(非常详细,附带示例)
java·python·算法
a程序小傲2 小时前
Maven 4 要来了:15 年后,Java 构建工具迎来“彻底重构”
java·开发语言·spring boot·后端·spring·重构·maven
牧小七2 小时前
java Records 怎么使用
java
LiRuiJie2 小时前
深入剖析RocketMQ
java·rocketmq