希望实现的功能是调用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;
}
}
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).start(); 改成:
MyThread myThread=new MyThread(reFile);
myThread.start();2 把这句 new MyThread(reFile).closeMonitoringThread();改为
myThread.closeMonitoringThread(); 之所以这样改的原因是,前后创建了两个线程类MyThread对象,那么new MyThread(reFile).closeMonitoringThread();这句执行完后,修改了本对象的
flag, 而线程对象里的那个 flag 没变。
run()方法结束,线程自然结束了。
而到了另外的方法,原有的定义的类的线程对象都失效了。 所以我建议楼主单独设计一个类,
里面有一个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