2014-09-29 51 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);