我有以下代码: 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来安排这样的任务?
提前致谢。
答案 0 :(得分:1)
一个。这两种方法是否相互干扰?
没有。它们都在不同的线程中执行。他们过着自己的生活。
湾将这两者结合使用是否有任何利弊?
不是真的。你想要并发任务,这就是你拥有的。
尝试支持ExecutorService
(由Executors
构建)来运行Runnable
以隔离任务及其同时执行的方式。
℃。有没有办法使用Thread来安排这样的任务?
是的,使用ScheduledExecutorService
:
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(controller, 0, 17, TimeUnit.SECONDS);