我写了个记事本
在里面用一个线程来在文本域中显示时间
此时我要读入文本 该怎么停止这个线程?
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();
}
----------------解决方案--------------------------------------------------------
不是有个wait方法吗
----------------解决方案--------------------------------------------------------
wait()说是等待另一个线程来唤醒它
但是在我的frame里面就一个线程
我唤醒的时候就出错,说是current thread is not the owner.....
----------------解决方案--------------------------------------------------------
interrupt()中断线程。
yield()暂停当前正在执行的线程对象,并执行其他线程。
试试这两个.
----------------解决方案--------------------------------------------------------
都试过了
interrupt()会返回interrupt attempt to write lock
yield()肯定不行,我就一个线程,没有其他线程,和没用一样
----------------解决方案--------------------------------------------------------
exit(0)
----------------解决方案--------------------------------------------------------
System.exit(0)???
那是终止当前的虚拟机,不是把我的主程序都给断了......
----------------解决方案--------------------------------------------------------
可以在线程中调用类方法Thead.currentThread()来返回当前线程的引用.
只要runner和currentThread()指向相同的对象,下面的方法runz()将继续循环:
public void run(){
Thread thisThread = Thread.currentThread();
while(runner == thisThread){
//..
}
}
使用了类似这样的循环,可以在任何地方使用下面的语句终止线程:
runner = null;
----------------解决方案--------------------------------------------------------
现在好象已经没有强制终止线程的方法了,lz只有研究interrupt方法怎么实现
----------------解决方案--------------------------------------------------------
8楼在线程未启动之前该给那两变量赋什么值?
我也用过类似的方法,用一个布尔值来控制线程
但是能够关闭,重启线程就出错了。
再看一遍线程,研究研究.....
----------------解决方案--------------------------------------------------------