* 多线程显示
* 建立一个线程
* 在定义类时,若该类将要作为线程执行的一个任务,则定义时需要实现Runnable接口
* 重写run方法
* 新建一个类A的实例,即相当于一个新的任务
* 新建一个Thread类的实例t,在新建是将类A的实例,作为参数传进去
* 启动线程t,即t.strat,即开启一个线程,交由cpu调度执行
* 当一个线程被开始调度执行时,会自动执行线程所做任务的run方法,
* run方法执行结束,则该线程也随之结束
public class MyPlayer implements Runnable {//创建MyPlayer实现Runnable接口
private Player player;//定义player对象
@Override
public void run() {//重写run方法
// TODO Auto-generated method stub
try {
try {
player = new Player(new FileInputStream("jiangnan.mp3"));//初始化player
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
player.play();//播放音乐
System.out.println("本歌曲播放完毕");
} catch (JavaLayerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在面板类(业务逻辑实现)中
MyPlayer m1 = new MyPlayer(); // 新建一个Thread类的实例t,在新建是将类MyPlayer的实例,作为参数传进去
public void mouseClicked(MouseEvent e) {//点击按钮如果没有播放,新建实例调用run播放
// TODO Auto-generated method stub
if(!isPlaying){//如果没有播放
Thread t = new Thread(m1);
t.start();
isPlaying = true;
btnPlayControl.setText("停止播放");
}else{
m1.stop();//如果播放,调用实例(不是线程实例)stop方法
isPlaying = false;
btnPlayControl.setText("播放音乐");
}
在MyPlayer中新建
public void stop() {
// TODO Auto-generated method stub
player.close();//结束线程中的任务,线程也随之结束
}