java小球平抛运动代码多线程
时间: 2024-09-30 22:08:06 浏览: 33
在Java中,模拟小球平抛运动并使用多线程通常是为了演示并发和动画效果。以下是一个简单的示例,我们将创建两个线程分别处理水平方向的速度变化(时间循环)和垂直方向的自由落体运动。假设我们已经有一个`Ball`类表示小球,它包含了位置(x, y)、速度(vx, vy)等属性。
```java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ParabolicMotion extends JFrame {
private Ball ball;
private Thread horizontalThread;
private Thread verticalThread;
public ParabolicMotion() {
ball = new Ball(0, 0, 0, 0); // 初始位置和速度为0
JPanel panel = new JPanel();
panel.add(new JLabel("小球轨迹"));
add(panel);
Timer timer = new Timer(50, new ActionListener() { // 每隔50毫秒更新一次
@Override
public void actionPerformed(ActionEvent e) {
updatePosition();
repaint();
}
});
timer.start();
startHorizontalMovement();
startVerticalMovement();
}
private synchronized void startHorizontalMovement() {
horizontalThread = new Thread(() -> {
while (true) {
ball.vx += 1; // 水平速度递增
try {
wait(); // 等待垂直线程更新位置
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
});
horizontalThread.start();
}
private synchronized void startVerticalMovement() {
verticalThread = new Thread(() -> {
while (ball.vy > 0) { // 垂直方向直到速度降为0
ball.vy -= 0.1; // 自由落体
ball.y += ball.vy; // 更新位置
notifyAll(); // 唤醒等待的线程
}
});
verticalThread.start();
}
private void updatePosition() {
ball.x += ball.vx;
ball.y += ball.vy;
ball.drawOnPanel(this);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ParabolicMotion window = new ParabolicMotion();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);
});
}
private class Ball {
// ... 实现球的位置、速度以及绘图方法
}
}
```
在这个例子中,`startHorizontalMovement`和`startVerticalMovement`方法启动了两个线程,一个负责水平移动,另一个负责垂直下落。关键在于同步方法`wait`和`notifyAll`,它们保证了两个线程不会同时修改球的位置,实现了正确的动画效果。
阅读全文