2014-09-29 52 views
0

我有以下代码: 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毫秒的时间间隔更新线程。

在Robot类我让机器人做一些2.5秒CTRL后,每按一次,

我的问题如下: 由于线程的主类是使用和定时器在Robot类中使用(都实现run()函数):

一个。这两种方法是否会相互打断?

b。将这两者结合使用有什么优点/缺点?

c。有没有一种方法可以使用Thread来调度这类任务?

在此先感谢。

+0

“......在17毫秒的时间间隔,其更新”,在您的示例Controller.run()方法不显示的循环。它睡一会儿17毫秒,然后它做东西。 – 2014-09-29 19:24:39

+0

如果您想每17毫秒执行一次任务,那么您可能不想在循环中休眠17毫秒。这将在一次执行的结束和下一次执行的开始之间等待17毫秒。这个周期不仅会长于17毫秒,还可能是可变的。 (取决于任务)。考虑使用ScheduledExecutorService.scheduleAtFixedRate()来代替。 – 2014-09-29 19:29:07

回答

1

一个。这两种方法是否会相互打断?

号他们都在不同的线程执行。他们过着自己的生活。

湾将这两者结合使用有什么优点/缺点?

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

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

℃。有没有一种方法可以使用Thread来调度这类任务?

是,使用ScheduledExecutorService

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