希望实现的功能是调用CloseFile()后,可以结束掉该文件占用的线程
package FileProtection;import java.io.File;
import java.io.FileInputStream;import javax.swing.JFileChooser;public class FileProtect {
public String OpenFile()
    {
String a="";
JFileChooser jfc = new JFileChooser();
    if(jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
        File reFile= jfc.getSelectedFile();
       System.out.println("添加保护文件 " +
               reFile.getName());
       new MyThread(reFile).start();
      a=reFile.getName();
    }return a;
}
public String CloseFile()
{
String b ="";
JFileChooser jfc = new JFileChooser();
if(jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
    File reFile= jfc.getSelectedFile();
   System.out.println("移除保护文件 " +
           reFile.getName());
   new MyThread(reFile).closeMonitoringThread();
  b=reFile.getName();
}return b;
}
}class MyThread extends Thread{
private File file;
private boolean flag = true;

@Override
public void run() {
try{
FileInputStream files=new FileInputStream(file);
file.setWritable(false);
while (true) {
if (!flag){
file.setWritable(true);
files.close();
break;
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public void closeMonitoringThread() {
setFlag(false);
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}

public MyThread(File file) {
this.file = file;
}

}

解决方案 »

  1.   

    两处new MyThread(reFile)是两个不同的一个线程。MyThread.run()是死循环
      

  2.   

    楼主可以这样试试:
    1 把语句   new MyThread(reFile).start(); 改成:
    MyThread myThread=new MyThread(reFile);
    myThread.start();2 把这句 new MyThread(reFile).closeMonitoringThread();改为
    myThread.closeMonitoringThread(); 之所以这样改的原因是,前后创建了两个线程类MyThread对象,那么new MyThread(reFile).closeMonitoringThread();这句执行完后,修改了本对象的
    flag, 而线程对象里的那个 flag 没变。
    run()方法结束,线程自然结束了。
      

  3.   

    因为1和2的myThread不在一个方法中,好像不能直接用,有什么办法吗请问?
      

  4.   

    可不可以把flag定义成静态的?
      

  5.   

    本题实际问题是让运行的线程检测到一个需要停下来的标志。但由于启动线程是在一个方法里面,
    而到了另外的方法,原有的定义的类的线程对象都失效了。 所以我建议楼主单独设计一个类,
    里面有一个flag,在CloseFile()方法里,只要改变这个类的对象的状态;而MyThread里检测这
    个类的对象。我在楼主的代码基础上模拟一下,能达到目的。
    代码如下:import java.io.File;
    import java.io.FileInputStream;
    import javax.swing.JFileChooser;public class FileProtectClassFlag
    {
    MyFlag myFlag=new MyFlag(); //新加
    public static void main(String[] args)
    {
    FileProtectClassFlag fpc=new FileProtectClassFlag();
    String a=fpc.openFile();
    System.out.println("fpc.openFile() is    "+a);
    try
    {
    Thread.sleep(1000);
    }
    catch(InterruptedException e)
    {
    e.printStackTrace();
    }
    String b=fpc.closeFile();
    System.out.println("fpc.closeFile() is    "+b);
    } public String openFile()
       { String a="";
    JFileChooser jfc = new JFileChooser();
       if(jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
            {
       File reFile= jfc.getSelectedFile();
       System.out.println("添加保护文件 " +
       reFile.getName());
       new MyThread(reFile,myFlag).start(); //产生线程对象(传进myFlag对象)。
       a=reFile.getName();
       }
    return a;
    }
    //---------------end openFile

    public String closeFile()
    {
    String b ="";
    JFileChooser jfc = new JFileChooser();
    if(jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) 
    {
       File reFile= jfc.getSelectedFile();
       System.out.println("移除保护文件 " +
       reFile.getName());
       //new MyThread(reFile).closeMonitoringThread();
    myFlag.setStopFlag(false); //设置线程停止标志。
       b=reFile.getName();
    }
    return b;
    }
    }
    //==========================end class FileProtectclass MyThread extends Thread
    {
    private File file;
    private boolean flag = true;
    private MyFlag myFlag; //定义一个MyFlag类变量。 @Override
    public void run()
            {
    try
    {
    FileInputStream files=new FileInputStream(file);
    file.setWritable(false);
    while (true)
            {
    if (!myFlag.getStopFlag()) //标志来自本类外。
    {
    file.setWritable(true);
    files.close();
    break;
    }
    }
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }//end run public void closeMonitoringThread() //这个就没用了。
            {
    setFlag(false);
    } public boolean isFlag()
            {
    return flag;
    } public void setFlag(boolean flag)
            {
    this.flag = flag;
    } public MyThread(File file,MyFlag myFlag) //构造方法进行了修改。
            {
    this.file = file;
    this.myFlag=myFlag;
    }
    }//==== class MyFlag
    class MyFlag
    {
    private boolean stopFlag=true; //if false the thread will stop
    public MyFlag()
    {
    }
    public void setStopFlag(boolean stopFlag)
    {
    this.stopFlag=stopFlag;
    }
    public boolean getStopFlag()
    {
    return stopFlag;
    }
    }//end class MyFlag