这是一个多线程的小程序,功能效果可以看附件里的图片。
package c;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ThreadTest
{
public static void main(String [] agrs)
{
ThreadFrame frame =new ThreadFrame(3); //建三个面板
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//主框架类
class ThreadFrame extends JFrame
{
public ThreadFrame(int k)
{
setTitle("线程框架");
setSize(600,400);
setLocation(300,200);
setLayout(new GridLayout(k,1)); //网格布局
for(int i=0;i<k;i++)
{
ThreadPanel panel=new ThreadPanel(i);
add(panel);
}
}
}
//面板类(包含一个文本行和另一个带有文本和按钮的面板)
class ThreadPanel extends JPanel implements ActionListener
{
TextField tf1;
JPanel p1; //用来放一个文本行和两个按钮的面板
JLabel label;
JTextField tf2;
JButton button1;
JButton button2;
int sleeptime;
public ThreadPanel(int i)
{
tf1=new TextField("测试线程"+i,100); //添加显示文本行
p1=new JPanel(); //创建有标签和控制按钮的面板
label=new JLabel("睡眠"); //添加标签
tf2=new JTextField(10); //添加编辑睡眠时间的文本行
sleeptime=(int)(Math.random()*100); //随机产生睡眠时间
tf2.setText(""+sleeptime); //显示睡眠时间
button1=new JButton("启动");
button2=new JButton("中断");
button1.addActionListener(this); //增加监听
button2.addActionListener(this);
p1.add(label);
p1.add(tf2);
p1.add(button1);
p1.add(button2);
setLayout(new GridLayout(2,1)); //两行一列的网格布局
add(tf1);
add(p1);
}
//Thread1 t1=new Thread1(); //创建一个线程
//实现监听
public void actionPerformed(ActionEvent e)
{
Thread1 t1=new Thread1(); //创建一个线程
if((e.getActionCommand()).equals("启动"))
{
t1.start(); //启动线程
button1.setEnabled(false); //把中断按钮设为可用
button2.setEnabled(true); //把启动按钮设为不可用
System.out.println("成功启动!");
}
else if((e.getActionCommand()).equals("中断"))
{
t1.interrupt(); //中断线程
button1.setEnabled(true); //把启动按钮设为可用
button2.setEnabled(false); //把中断按钮设为不可用
System.out.println("线程已被中断!");
}
}
//内部线程类
class Thread1 extends Thread
{
public Thread1()
{
String str=tf1.getText();
for(int i=0;i<100;i++)
{
str=str+" "; //设置待循环字符串
}
tf1.setText(str);
}
public void run()
{
//System.out.println("调用成功!");
String str;
while(this.isAlive()&&!this.isInterrupted())
{
try
{
str=tf1.getText();
str=str.substring(1)+str.substring(0,1); //取字符串首字符接在其尾部
tf1.setText(str);
sleeptime=Integer.parseInt(tf2.getText()); //将字符串形式的睡眠时间转为整形
this.sleep(sleeptime); //睡眠
}
catch(InterruptedException e) //处理中断异常
{
System.out.println(e);
break; //退出循环
}
catch(Exception e) //捕获“睡眠时间”输入异常
{
System.out.println("输入出现异常!");
button1.setEnabled(true);
break; //退出循环
}
}
}
}
}
这是我一开始写的,这样写就是每点一次按钮就生成一个线程,所以不能看到“中断”效果。于是我想把生成线程的那条诗句(第二个红色部分)放在第一个红色部分的位置,可是运行的时候出现异常。希望大家帮我看看,该怎么解决,我在这儿先谢过了。