我有一个关于使用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();
}
}
当我运行程序时,我同时打印了所有三个句子,它们之间没有时间差异
答案 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]);
}
}
}