当前位置: 代码迷 >> Java相关 >> [求助]一个关于多线程的问题。
  详细解决方案

[求助]一个关于多线程的问题。

热度:308   发布时间:2007-06-02 19:56:28.0
[求助]一个关于多线程的问题。

这是一个多线程的小程序,功能效果可以看附件里的图片。
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; //退出循环
}
}

}

}
}
这是我一开始写的,这样写就是每点一次按钮就生成一个线程,所以不能看到“中断”效果。于是我想把生成线程的那条诗句(第二个红色部分)放在第一个红色部分的位置,可是运行的时候出现异常。希望大家帮我看看,该怎么解决,我在这儿先谢过了。

搜索更多相关的解决方案: 线程  

----------------解决方案--------------------------------------------------------


----------------解决方案--------------------------------------------------------
怎么这帖子沉得这么快啊!没人帮看下,是我写得太烂了吗?如果是麻烦你们告诉我一下,我也好改啊!
----------------解决方案--------------------------------------------------------
太难了,不是很清除!
----------------解决方案--------------------------------------------------------

设一个标量,当标量为中断状态时,调用wait()方法

恢复时再notify()


----------------解决方案--------------------------------------------------------

谢谢千里回贴,你说得对,执行中断的时候应该是调用wait()更好,这样第二次点“启动”的时候只要调用notify()就好了。

我的意思是我这样写(创建线程的代码在第二个红色部分)的话,点击一下按钮就会产生一个线程,所以点击“启动”后再点击“中断”按钮时,本来是要中断已经启动的那个“线程1”的,可是它却产生另外一个“线程2”,对线程2执行中断操作,而不会对“线程1”执行中断操作。所以我想把创建线程的代码放在第一个红色代码部分。但是这样写编译的时候没问题,运行时出现异常了。你能帮我再看看吗?


----------------解决方案--------------------------------------------------------
在线程里面去取一个标量,然后线程里面调用wait
----------------解决方案--------------------------------------------------------

谢谢千里,问题解决了。我把创建线程的语句放在点击“启动”按钮的动作事件里面,也就是说只有启动的时候才产生线程。


----------------解决方案--------------------------------------------------------
  相关解决方案