| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2410 人关注过本帖
标题:如何停止线程
只看楼主 加入收藏
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
结帖率:0
收藏
 问题点数:0 回复次数:9 
如何停止线程

我写了个记事本
在里面用一个线程来在文本域中显示时间
此时我要读入文本 该怎么停止这个线程?

package textedit;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class TXTFrame extends JFrame{

public TXTFrame(){

panel=new TXTPanel();
add(panel);

setTitle("记事本");
Toolkit kit=getToolkit();
Dimension screen=kit.getScreenSize();
int width=screen.width;
int height=screen.height;
setBounds(width/4,height/4,width/2,height/2);

file=new JMenu("文件");
edit=new JMenu("编辑");

m1=new JMenuItem("新建");
m2=new JMenuItem("打开");
m3=new JMenuItem("保存");
m4=new JMenuItem("另存为") ;
m5=new JMenuItem("退出");

m6=new JMenuItem("撤销");
m7=new JMenuItem("剪切");
m8=new JMenuItem("复制");
m9=new JMenuItem("粘贴");
m10=new JMenuItem("删除");
m11=new JMenuItem("查找");
m12=new JMenuItem("查找下一个");
m13=new JMenuItem("替换");
m14=new JMenuItem("转到");
m15=new JMenuItem("全选");
m16=new JMenuItem("时间/日期");

m1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
panel=new TXTPanel();
add(panel);
}
});

m2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
/*setBoolean(false);
setThread();*/
i=false;

chooser.setCurrentDirectory(new File("E:\\me"));
chooser.setFileFilter(filter);
//chooser.setAcceptAllFileFilterUsed(false);
//chooser.setSelectedFile(new File("1.txt"));
//System.out.print(JFileChooser.CANCEL_OPTION);
int ss=chooser.showOpenDialog(TXTFrame.this);
//System.out.print(ss);
if(ss==JFileChooser.APPROVE_OPTION){


String s,s2=new String(),str;
try{
//str=chooser.getCurrentDirectory().toString()+"\\"+chooser.getSelectedFile().getName();
in=new BufferedReader(new FileReader(chooser.getSelectedFile().getPath()));
while((s=in.readLine())!=null)
s2+=s+"\n";
in.close();
panel.getJText().setText(s2);
}catch(IOException e){
e.printStackTrace();
}
}
/*if(ss==JFileChooser.CANCEL_OPTION){
panel.text.setText(chooser.getCurrentDirectory().toString());
}*/
}
});

m3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
/*setBoolean(false);
setThread();*/

chooser.setCurrentDirectory(new File("E:\\me"));
chooser.setFileFilter(filter);
chooser.setAcceptAllFileFilterUsed(false);
int ss=chooser.showSaveDialog(TXTFrame.this);
if(ss==JFileChooser.APPROVE_OPTION){
String s;
s=panel.getJText().getText();
//System.out.print(s);
try{
String str=chooser.getSelectedFile().getPath()+filter.getDescription();
out=new BufferedWriter(new FileWriter(str));
out.write(s);
out.close();
}catch(IOException e){

}
}
}
});

m4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
/*setBoolean(false);
setThread();*/

chooser.setCurrentDirectory(new File("E:\\me"));
chooser.setFileFilter(filter);
int ss=chooser.showSaveDialog(TXTFrame.this);
if(ss==JFileChooser.APPROVE_OPTION){
String s=panel.getJText().getText();
try{
String str=chooser.getSelectedFile().getPath()+filter.getDescription();
out=new BufferedWriter(new FileWriter(str));
out.write(s);
out.close();
}catch(IOException e){

}
}
}
});

m5.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});

m16.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
if(!d.isAlive()){
i=true;
d.start();
}/*else if(d.isAlive()){
i=true;
}*/

}
});


file.add(m1);
file.add(m2);
file.add(m3);
file.add(m4);
file.add(new JSeparator());
file.add(m5);

edit.add(m6);
edit.add(new JSeparator());
edit.add(m7);
edit.add(m8);
edit.add(m9);
edit.add(m10);
edit.add(new JSeparator());
edit.add(m11);
edit.add(m12);
edit.add(m13);
edit.add(m14);
edit.add(new JSeparator());
edit.add(m15);
edit.add(m16);

menubar=new JMenuBar();
menubar.add(file);
menubar.add(edit);
setJMenuBar(menubar);
}

private class DateThread extends Thread{
public void run(){
if(i){
while(i){
panel.getJText().setText(new Date().toString());
try{
Thread.sleep(100);
}catch(InterruptedException e){

}
}
}else{
return;
}
}
}

/*public void setBoolean(boolean i){
this.i=i;
}

public void setThread(){
if ( i ) {
if(d.isAlive()&&d.){
d.notify();
}else{
d.start();
}
}
else {
try{
if(d.isAlive())
d.wait();
}catch(InterruptedException e){
e.printStackTrace();
}

}
}
*/


private JMenuItem m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16;
private TXTPanel panel;
private JMenuBar menubar;
private JMenu file,edit;
private JFileChooser chooser=new JFileChooser();
private File f;
private BufferedReader in;
private BufferedWriter out;
private TXTFilter filter=new TXTFilter();
private boolean i=false;
private DateThread d=new DateThread();
}


搜索更多相关主题的帖子: 线程 import java awt panel 
2007-07-11 14:33
野蛮女人
Rank: 5Rank: 5
等 级:贵宾
威 望:19
帖 子:827
专家分:0
注 册:2007-4-7
收藏
得分:0 
不是有个wait方法吗

[shadow=255,purple,5]好人不长命,祸害一万年![/shadow]
2007-07-11 21:53
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
wait()说是等待另一个线程来唤醒它
但是在我的frame里面就一个线程
我唤醒的时候就出错,说是current thread is not the owner.....
2007-07-12 08:31
heilong
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:777
专家分:0
注 册:2007-6-7
收藏
得分:0 
interrupt()中断线程。
yield()暂停当前正在执行的线程对象,并执行其他线程。
试试这两个.

风水鸡蛋壳,财去人安乐!----->
2007-07-12 08:48
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 

都试过了
interrupt()会返回interrupt attempt to write lock
yield()肯定不行,我就一个线程,没有其他线程,和没用一样

2007-07-12 10:50
野蛮女人
Rank: 5Rank: 5
等 级:贵宾
威 望:19
帖 子:827
专家分:0
注 册:2007-4-7
收藏
得分:0 
exit(0)

[shadow=255,purple,5]好人不长命,祸害一万年![/shadow]
2007-07-12 12:20
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 

System.exit(0)???
那是终止当前的虚拟机,不是把我的主程序都给断了......

2007-07-12 17:52
威震天下
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-19
收藏
得分:0 
可以在线程中调用类方法Thead.currentThread()来返回当前线程的引用.
只要runner和currentThread()指向相同的对象,下面的方法runz()将继续循环:
public void run(){
Thread thisThread = Thread.currentThread();
while(runner == thisThread){
//..
}
}

使用了类似这样的循环,可以在任何地方使用下面的语句终止线程:
runner = null;
2007-07-12 20:51
guoxhvip
Rank: 8Rank: 8
来 自:聖西羅南看臺
等 级:贵宾
威 望:44
帖 子:4052
专家分:135
注 册:2006-10-8
收藏
得分:0 
现在好象已经没有强制终止线程的方法了,lz只有研究interrupt方法怎么实现

愛生活 && 愛編程
2007-07-12 21:59
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
8楼在线程未启动之前该给那两变量赋什么值?
我也用过类似的方法,用一个布尔值来控制线程
但是能够关闭,重启线程就出错了。
再看一遍线程,研究研究.....
2007-07-13 08:52
快速回复:如何停止线程
数据加载中...
 
   



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

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