使用java中的Timer和TimerTask打印不同的变量

时间:2015-07-07 23:00:53

标签: java timer timertask

我有一个关于使用Timer打印句子的小问题。我知道扩展TimerTask和覆盖run方法的过程,但在这里我可以打印一个静态句子。 但在我的情况下,我必须在不同的时间段打印一个歌曲列表(来自数组)和一个艺术家列表(来自数组)。

例如我有3首歌曲:第一首歌曲有3分钟,第二首歌曲有2.5分钟,第三首歌曲有5分钟。输出应如下:

艺术家一的歌曲正在播放...... (3分钟后) 艺术家二的歌二正在播放...... (2.5分钟后) 艺术家三的歌三正在播放...... (5分钟后) 程序停止。

到目前为止我的代码是:

主类:

package test;

import java.util.Timer;

public class Test {

public static void main(String[] args) {

    Timer timer = new Timer("Printer");



    for(int i = 0 ; i < 3 ; i++) {
        Thread t = new Thread();
        int dur = t.getDurations()[i];
        timer.schedule(t, 0, dur);
    }


}
}

扩展TimerTask的类:

package test;

import java.util.TimerTask;

/**
*
* @author GraphPixel
*/
public class Thread extends TimerTask {
String[] song_list = { "Song One", "Song Two", "Song Three" };
String[] artist_list = { "Artist One", "Artist Two", "Artist Three" };
int[] durations = { 2000, 1500, 2500 };

public int[] getDurations() {
    return durations;
}

public String[] getSong_list() {
    return song_list;
}

public String[] getArtist_list() {
    return artist_list;
}

@Override
public void run() {
    int i = 0;
        System.out.println(song_list[i] + " played by " + artist_list[i]);
        i++;
    cancel();
}

}

当我运行程序时,我同时打印了所有三个句子,它们之间没有时间差异

1 个答案:

答案 0 :(得分:0)

您正在多次安排相同的线程。所以一旦它已经被调度,在循环的第二次迭代中,当代码再次尝试安排它时,你得到IllegalStateException

您需要在循环中创建单独的Thread对象

import java.util.Timer;

public class Test {

 public static void main(String[] args) {

    Timer timer = new Timer("Printer");        

    for(int i = 0 ; i < 3 ; i++) {
        Thread t = new Thread();
        timer.schedule(t, 0, t.getDurations()[i]);
    }    
  }
}