Java Swing Timers&线程和唯一的最后一个命令正在For循环中执行

时间:2014-06-01 18:36:22

标签: java multithreading swing loops timer

希望你们一切顺利。

此外,我很抱歉这是多久的啰嗦。我是Java的新手,所以请原谅我缺乏知识/术语/ Java惯例。

基本上我已经创建了一个程序,它接受用户输入并将车辆移动到表面区域。因此,用户输入可以是" 50 left 4"这意味着向前走50米,向左转,向前走4米。 对于车辆,我在JPanel上使用绘画方法。当车辆向前移动时,它最初从该区域的一侧跳到另一侧。我希望能够看到它逐米移动。所以我添加了一个Swing Timer,它将车辆移动1米,暂停一秒钟,将车辆移动2米等等。

现在,问题在于,当我输入命令" 50 left 4"时,车辆只需向左转,然后向前移动4米。它忽略了第一个数字命令。当我输入" 3 4"时会发生同样的情况,它将忽略3并向前移动4米。当我进入" 3左"时,它将先左转,然后向前移动3米。现在,我已经获得了用户输入的方法,将其切换成数组,通过循环提供数组的每个元素,检查它是否为整数。如果它是一个整数,它会使车辆向前移动,如果不是,它会向左或向右转动车辆。一切正常,我很满意。

所以我认为我所做的是拥有移动车辆工具Runnable的类,这样该方法将从一个单独的线程执行,使主线程等待,这样它就会赢得“不”。忽略除最后一个之外的所有命令。但这也不起作用。

这是使用摆动计时器将车辆一次向前移动1米的运动等级 它实现了Runnable。它是抽象的,因为我需要run方法将用户输入命令作为参数。这是导致问题的原因吗?

public abstract class Movement implements Runnable {


    static int count = 0;
    static int distance;


    public static void moveRover() {
        // Every 1 second the timer will move the Rover 40 pixels.
        at.translate(0, 40);
    }

    public static void getDistance(int num) {
        distance = num;

    }

    static Timer timer = new Timer(500, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            moveRover();
            count++;
            System.out.println(count);

            if (count == distance) {

                stop();
                System.out.println("Timer stopped");
                count = 0;
            }
        }
    });

    public static void start(int num) {
        getDistance(num);
        System.out.println("Distance rover will travel: " + distance);
        System.out.println("\nTimer started");
        timer.start();
    }

    public static void stop() {
        timer.stop();
    }

    public void run(int num) {
        start(num);
    }

    public Movement(int num) {
        System.out.println("Start RUN method");
        run(num);

    }

这是来自另一个运行for循环和线程的类的代码:

public static void action(final String[] commands) {

        for (int i = 0; i < commands.length; i++) {

            if (isInteger(commands[i])) {
                int distance = Integer.parseInt(commands[i]);

                Movement h1 = new Movement(distance) {
                    @Override
                    public void run() {
                        System.out.println("Empty run method");
                    }
                };

                Thread t1 = new Thread(h1);

                t1.start();
                System.out.println(t1.isAlive());

                try {
                    t1.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            } else {
                Direction.start(commands[i]);
                String pos = Direction.getDirection(); // GET DIRECTION
            }
        }
    }

我非常感谢你阅读所有这些,非常感谢你!

感谢所有回复的人!如果你知道我哪里出错了,我能做些什么来解决它,你就是一个绝对的救星,我真的很感激它:D

1 个答案:

答案 0 :(得分:0)

所以是的,您需要了解Java中的线程。从Java 1.6及更高版本开始,你永远不应该使用Thread.start()。坦率地说,我甚至不确定你为什么在for-loop中使用Threads。暂时忽略所有可疑的设计选择,请尝试以下代码:

public static void action(final String[] commands) {

    for (int i = 0; i < commands.length; i++) {

        if (isInteger(commands[i])) {
            int distance = Integer.parseInt(commands[i]);

            new Movement(distance) {
                @Override
                public void run() {
                    System.out.println("Empty run method");
                }
            }.run();

        } else {
            Direction.start(commands[i]);
            String pos = Direction.getDirection(); // GET DIRECTION
        }
    }
}