《智能仿真无人机平台(多线程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 分钟前
[JDBC]PreparedStatement替代Statement
java·数据库
觉醒大王6 分钟前
哪些文章会被我拒稿?
论文阅读·笔记·深度学习·考研·自然语言处理·html·学习方法
方安乐22 分钟前
科普:股票 vs 债券的区别
笔记
_F_y24 分钟前
C++重点知识总结
java·jvm·c++
打工的小王26 分钟前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
毕设源码-赖学姐27 分钟前
【开题答辩全过程】以 高校体育场馆管理系统为例,包含答辩的问题和答案
java·spring boot
我真会写代码29 分钟前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design29 分钟前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
DN金猿35 分钟前
接口路径正确,请求接口却提示404
java·tomcat
Maynor9961 小时前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能