智能仿真无人机平台(多线程V1.0)技术笔记
一、核心前置知识
1. 基础依赖
- Java语法:数据类型、输入输出、变量、运算符、条件判断、循环语句、数组
- 数据结构:数组、链表、队列、栈、线性表、集合、哈希表
- 面向对象:类与对象、继承、封装、接口、泛型
- 计算机基础:操作系统、计算机组成原理、JVM(Java虚拟机)
2. 进程与线程核心概念
- 程序:磁盘中的文件(代码+数据),静态存在,无法直接解决问题。
- 进程:正在运行的程序(代码+数据加载到内存),是操作系统分配资源的最小单元,可调度CPU/RAM/IO。
- 线程:进程的组成部分,是CPU分配执行任务的最小单元,进程内多线程可共享数据,一个进程至少包含一个线程。
二、Java实现多线程的三种方式
1. 继承Thread类
- 步骤:
- 定义类继承 Thread ;
- 重写 run() 方法(存放线程独立执行的代码);
- 创建类对象,调用 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接口(推荐优先使用)
- 步骤:
- 定义类实现 Runnable 接口;
- 重写 run() 方法(编写线程执行逻辑);
- 创建接口实现类对象,传入 Thread 构造器;
- 调用 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);
}
}
