我需要每2秒生成一个新的Thread
。所以我尝试在Timer
方法中使用main(String[])
类,但我的程序在Timer
构造函数中指定的毫秒之后才存在。
Program.java :
public class Program
{
private static int panelWidth;
private static int panelHeight;
private static MyPanel panel = new MyPanel();
public static void main(String[] args)
{
MyFrame frame = new MyFrame();
frame.add(Program.panel);
Program.panelWidth = frame.getWidth();
Program.panelHeight = frame.getHeight();
Timer generateBallTimer = new Timer(2000, new GenerateBalls());
while (true)
{
generateBallTimer.start();
}
} // End of main method
/**
* Generate a new ball every 2 seconds.
*
*/
public static class GenerateBalls implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
Program.generateBalls();
}
}
public static void generateBalls()
{
// Generate a ball each 2 seconds
while (true)
{
Program.panel.balls.add(new Ball(Program.panel));
}
}
} // End of program class
如果在Timer
构造函数中我将指定3000ms,我的程序将在3秒后关闭,依此类推。
我在这里做错了什么?
答案 0 :(得分:1)
你能给我一个例子"显示列表"?
你谈论"球"。你的计划需要了解什么球?可能它的位置,也许它的速度,也许它的质量。尺寸?颜色?其他的东西?它取决于你。 Ball
对象的最简单实现只是一个包含public
字段的类来保存所有这些信息。然后,如果Ball
是动画中唯一的移动对象,那么您的显示列表可能只是List<Ball>
。
在一个更复杂的程序中,您的Ball
课程可能是某些更通用的课程的扩展,可能是VisibleObject
,然后您的显示列表将是List<VisibleObject>
。
据我所知,为了让游戏中的所有对象同时工作,他们需要
Thread
s。
从某种意义上说,你是对的,因为在所有Java中只有一个类可以完成任何工作,而且该类是Thread
。实际上没有其他类做任何事情。其他类只定义可以通过线程调用的方法。
诀窍是,将程序中的线程与它们所做的工作分离。这是Runnable
界面的动机。而不是让一个对象同时 一个线程,而且描述了线程完成完成的工作,你可以有两个类;一个负责所有线程的东西(.start(),. interrupt(),。join(),...),另一个描述要完成的工作(.run())。
有人说,编写一个包含太多类/对象的程序很难,但写一个太少的程序很容易。
只要您的Ball
个对象或您的VisibleObject
个对象干净地描述了您希望在屏幕上看到的内容以及您希望看到这些内容移动的方式,就会有&#39;没有理由为什么每个人的方法必须由自己的专用线程调用。您没有理由不能只使用一个线程来为每个线程进行计算。