计时器和线程问题

时间:2014-09-29 18:19:00

标签: java multithreading timer

我有以下代码: Controller.java:

package Test;

import java.applet.Applet;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Controller extends Applet implements Runnable, KeyListener {
    private Robot robot = new Robot();
    @Override
    public void init() {
        setSize(800, 480);
        setBackground(Color.BLACK);
        setFocusable(true);
        addKeyListener(this);
    }

    @Override
    public void start() {

        Thread thread = new Thread(this);
        thread.start();
    }
    public void run() {
        try {
            Thread.sleep(17);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ... Do Stuff ....
    }
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        super.destroy();
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        super.stop();
    }
    @Override
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_CONTROL:
            robot.fire();
            break;
        }   
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }
}

Robot.java

package Test;

import java.util.Timer;
import java.util.TimerTask;

public class Robot {
    private Timer timer = new Timer(); 
    private int firerate = 2500; 
    public Robot() {
    }
    public void fire() {
            timer.schedule(new TimerTask() {
                  @Override
                  public void run() {
                    System.out.println("2 Seconds!");
                  }
                }, firerate);
        }
    }

我有一个以17 ms的间隔运行更新的线程。

在Robot类中,我按下CTRL后每次使机器人做2.5秒的事情

我的问题如下: 由于Thread在Main类中使用,而Timer在Robot Class中使用(两者都实现run()函数):

一个。这两种方法是否相互干扰?

湾将这两者结合使用是否有任何利弊?

℃。有没有办法使用Thread来安排这样的任务?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

一个。这两种方法是否相互干扰?

没有。它们都在不同的线程中执行。他们过着自己的生活。

  

湾将这两者结合使用是否有任何利弊?

不是真的。你想要并发任务,这就是你拥有的。

尝试支持ExecutorService(由Executors构建)来运行Runnable以隔离任务及其同时执行的方式。

  

℃。有没有办法使用Thread来安排这样的任务?

是的,使用ScheduledExecutorService

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(controller, 0, 17, TimeUnit.SECONDS);