| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 622 人关注过本帖
标题:[求助]一个关于多线程的问题。
取消只看楼主 加入收藏
菜鸟也疯狂
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2007-3-20
收藏
 问题点数:0 回复次数:4 
[求助]一个关于多线程的问题。

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

}

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

搜索更多相关主题的帖子: 线程 
2007-06-02 19:56
菜鸟也疯狂
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2007-3-20
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


2007-06-02 19:57
菜鸟也疯狂
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2007-3-20
收藏
得分:0 
怎么这帖子沉得这么快啊!没人帮看下,是我写得太烂了吗?如果是麻烦你们告诉我一下,我也好改啊!

2007-06-03 21:07
菜鸟也疯狂
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2007-3-20
收藏
得分:0 

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

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


2007-06-04 11:52
菜鸟也疯狂
Rank: 1
等 级:新手上路
帖 子:134
专家分:0
注 册:2007-3-20
收藏
得分:0 

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


2007-06-05 15:19
快速回复:[求助]一个关于多线程的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022853 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved