gpt4 book ai didi

java - IllegalThreadStateException 一次又一次发生..停止后需要重新启动线程

转载 作者:行者123 更新时间:2023-12-01 04:49:11 24 4
gpt4 key购买 nike

需要制作一个音乐播放器作为我的简单java项目。它打开一个文件并将名称加载到文本字段中。当按下“播放”按钮时,该名称会在文本字段中圈出,当按下“暂停”按钮时,该圈圈会暂停。播放暂停是 JTogglebuttons,我有一个按钮名称为 stop。使用多线程,我可以播放和暂停字符串,但在我按停止一次后..如果我再次打开一个新的音乐文件并按播放,它会显示非法线程状态异常。请在这里帮助我..注意:我还没有把在其中播放音乐的代码中..一旦这个问题解决,我会将其放入。非常感谢你的

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import sun.audio.*;

public class search extends Thread implements ActionListener
{
JFrame f;
JButton stop,open;
JToggleButton play;
JTextField tf,text;
JTextArea ta;
JLabel lab,lab1;
String str,dest;
JScrollPane scrol;
File fl;
int myfl=0,myfl1=0,myfl2=0;
search()
{
f=new JFrame("Music Player");
f.setLayout(null);
f.setSize(620,300);

play=new JToggleButton("play");
play.setBounds(100,150,270,30);
play.addActionListener(this);
f.add(play);
play.setEnabled(false);


stop=new JButton("stop");
stop.setBounds(400,150,120,30);
stop.addActionListener(this);
f.add(stop);
stop.setEnabled(false);

open=new JButton("open");
open.setBounds(100,200,420,30);
open.addActionListener(this);
f.add(open);


tf=new JTextField();
tf.setBounds(25,50,565,40);
tf.setFont(new Font("DK BabySitter",Font.BOLD,20));
tf.setHorizontalAlignment(JTextField.CENTER);
f.add(tf);

f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}

public void actionPerformed(ActionEvent ae)
{
if(ae.getActionCommand().equals("open"))
{
FileDialog fd=new FileDialog(f,"Open Box",FileDialog.LOAD);
fd.setSize(300,300);
fd.setVisible(true);
String s1="mp3";
str=fd.getFile();
dest=fd.getDirectory()+fd.getFile();
if(str.toLowerCase().endsWith(s1))
{

tf.setText(str);
//pause.setEnabled(true);
play.setEnabled(true);
stop.setEnabled(true);
}
else
{
JOptionPane.showMessageDialog(f, "Select a valid file format");
}



}

if(ae.getActionCommand().equals("stop"))
{

play.setLabel("play");
myfl1=1;
tf.setText(" ");
stop();

}

if(ae.getActionCommand().equals("play"))
{
try
{
play.setLabel("pause");

if(myfl==1 && myfl1==0)
{
resume();
}

if(myfl==0 || myfl1==1)
{
start();
}
}
catch(IllegalThreadStateException e)
{
tf.setText("error a gya re");
Thread newth= new Thread();
newth.start();

}
}
if(ae.getActionCommand().equals("pause"))
{
play.setLabel("play");
myfl=1;
suspend();
}


}

public void run()
{
try
{
String rot=tf.getText();
char rotn[]=new char[rot.length()];
int flag=rot.length();
int move=0;
rotn=rot.toCharArray();
tf.setText(" ");
for(;;)
{
for(;;)
{
sleep(100);
tf.setText( tf.getText() + rotn[move]);
move++;

if(move==(flag-1))
{

move=0;
break;
}

}
tf.setText(" ");
}
}


catch(Exception e)
{
tf.setText("error occured");
}

}
public static void main(String args[])
{
try {
// Set System L&F
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch (UnsupportedLookAndFeelException e) {
// handle exception
}
catch (ClassNotFoundException e) {
// handle exception
}
catch (InstantiationException e) {
// handle exception
}
catch (IllegalAccessException e) {
// handle exception
}
new search();
}

}

最佳答案

您不应该使用Thread.stop() , Thread.suspend()Thread.resume() 。这些方法已被弃用并明确记录为具有严重影响(例如潜在的死锁等)。另请参阅Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? .

在这种特定情况下,会发生异常,因为您不能多次start() Thread。您需要对线程进行编码(或者更好的是:不要扩展Thread,而是实现Runnable),以便它正确处理应用程序的暂停、启动、停止等不使用 Thread 已弃用且危险的方法。

关于java - IllegalThreadStateException 一次又一次发生..停止后需要重新启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15266779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com