怎么改才能结束线程(代码如下)!

nidayizi 2008-11-11 10:56:25
这是一个类里面的三个方法!
stop()不能用;
public void play(){


if(BasicPlayer.isStop&&BasicPlayer.isActive){
basicPlayer=new BasicPlayer(soundFile);
thread=new Thread(basicPlayer);

thread.start();
}else if(!BasicPlayer.isStop&&!BasicPlayer.isActive) {
BasicPlayer.isActive=true;
}


}
//暂停
public void pause(){
if(!BasicPlayer.isStop&&BasicPlayer.isActive){
BasicPlayer.isActive=false;
}
}

//停止
public void Stop(){
if(!BasicPlayer.isStop){

thread.stop();
BasicPlayer.isStop=true;
return;
}
}
...全文
110 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
SylvanLiu 2008-11-12
  • 打赏
  • 举报
回复
你可以修改run方法让thread线程在你想让它结束的时候什么都不做;
但是,一个线程具体何时结束或死亡,并不能精确控制,毕竟stop方法已经不推荐使用;
在run里面加个while吧,用一个标记来表示你对这个线程的态度(你让它活着,它就做事;你让它死,它就在那里一动不动)
Iangao 2008-11-12
  • 打赏
  • 举报
回复
是不是你的basicPlayer.run方法中还有线程?
Iangao 2008-11-12
  • 打赏
  • 举报
回复
thread.interrupt()
nidayizi 2008-11-12
  • 打赏
  • 举报
回复
thread.interrupt()
已经用过了,好像不行。
能不能改成用循环的方式来结束进程!
nidayizi 2008-11-12
  • 打赏
  • 举报
回复
谢谢,可以了!
linghaowangluo 2008-11-12
  • 打赏
  • 举报
回复
在start()方法running置为true;
另一方法running置为false;

public void run(){
while(running)
{
/*线程要执行的代码*/}
}

Iangao 2008-11-12
  • 打赏
  • 举报
回复
改法:
1. while(inBytes!=-1 && !BasicPlayer.isStop) // 循环不结束线程是不会停的.必须让它知道已经停了
2. 如果要用interrupt, 就必须把InterruptedException处,加上break; // 得处理终端异常
nidayizi 2008-11-12
  • 打赏
  • 举报
回复
是我那个BasicPlayer里面的东西。

public class BasicPlayer implements Runnable{

//音频输入流
private AudioInputStream stream = null;
//音频格式
private AudioFormat format = null;
//源数据行
private SourceDataLine sourceDataLine;
//缓冲区大小
private static final int BUFFER_SIZE=1024*5;
private File fileName;
//能否播放
public static boolean isActive=true;
//是否停止
public static boolean isStop=true;

public static boolean flag = true ;

/**
* 构造器
* @param fileName 音频文件
*/
public BasicPlayer(File fileName) {
this.fileName=fileName;
}
/**
* 播放音频文件
*/
public void play(){

try {
//从提供的 File 获得音频输入流
stream=AudioSystem.getAudioInputStream(fileName);

//获得此音频输入流中声音数据的音频格式
format=stream.getFormat();
//音频编码转换

if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, //音频编码技术
format.getSampleRate(), //每秒的样本数
16, //每个样本的位数
format.getChannels(), //声道数
format.getChannels() * 2, //每帧的字节数
format.getSampleRate(), //每秒的帧数
false //指示是否以big-endian字节顺序存储单个样本中的数据(false 意味着 little-endian)
);
//格式化音频输入流
stream = AudioSystem.getAudioInputStream(format, stream);
}


//获得源数据行
sourceDataLine=getDataLine(format);

//允许数据行执行数据 I/O操作
sourceDataLine.start();

int inBytes=0;
byte[] audioData=new byte[BUFFER_SIZE];
BasicPlayer.isStop=false;
Date date=new Date();
System.out.println("开始时间:"+date.getMinutes()+":"+date.getSeconds());

while(inBytes!=-1){
//判断能否播放
if(BasicPlayer.isActive){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println("处于播放状态");
//从音频输入流读取一定数量的字节,并将其存储在缓冲区数组audioData中
inBytes = stream.read(audioData, 0, BUFFER_SIZE);
if (inBytes >= 0) {
//通过此源数据行将音频数据写入混频器
int outBytes = sourceDataLine.write(audioData, 0, inBytes);
}
}else{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println("处于暂停状态");
}
}
date=new Date();
System.out.println("结束时间:"+date.getMinutes()+":"+date.getSeconds());
BasicPlayer.isStop=true;
sourceDataLine.drain();
sourceDataLine.stop();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关闭源数据行
sourceDataLine.close();
try {
stream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
* 获得源数据行
* @param audioFormat
* @return 源数据行
*/
private SourceDataLine getDataLine(AudioFormat audioFormat){
//SourceDataLine是DataLine的子接口,主要作用充当其混频器的源,是可以写入数据的数据行
SourceDataLine res = null;

//DataLine是Line的子接口,Info是DataLine的一个静态的内部类
DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
try {
//获得与指定 Line.Info 对象中的描述匹配的行
res = (SourceDataLine) AudioSystem.getLine(info);
//打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作
res.open(audioFormat);
}
catch (Exception e) {
e.printStackTrace();
}
return res; //返回源数据行
}

/**
* 启动该线程
*/
public void run() {
// TODO Auto-generated method stub

if(BasicPlayer.isStop){
this.play();
}
}
}
nidayizi 2008-11-12
  • 打赏
  • 举报
回复
谢谢。我先试一下!
XinVSYuan 2008-11-11
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧