Java JVM在无故使用连续线程时关闭
我的程序遇到问题。 我正在尝试按结尾对下载的文件进行排序。到目前为止,我已经得到了观察给定文件路径并在Java JVM在无故使用连续线程时关闭,java,multithreading,file,timer,directory,Java,Multithreading,File,Timer,Directory,我的程序遇到问题。 我正在尝试按结尾对下载的文件进行排序。到目前为止,我已经得到了观察给定文件路径并在HashSet中列出这些文件的结构。 我现在的问题是,程序会持续运行几秒钟,但最后以退出代码0结束,所以一切都应该正常 public class WatchDir { protected HashSet<File> hashSetOfFiles; protected String filePath = ""; public WatchDir() {
HashSet
中列出这些文件的结构。
我现在的问题是,程序会持续运行几秒钟,但最后以退出代码0结束,所以一切都应该正常
public class WatchDir {
protected HashSet<File> hashSetOfFiles;
protected String filePath = "";
public WatchDir() {
chooseFilePath();
if (filePath.isEmpty())
return;
listAnfangFiles();
new Thread() {
public void run() {
listNewFiles();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
private void listNewFiles() {
File file = new File(filePath);
for (File f : file.listFiles()) {
if (hashSetOfFiles.add(f)) {
newFileFound(f);
}
}
}
private void newFileFound(File f) {
// Hier kommen alle neuen Dateien an
System.out.println(f.getName());
}
private void listAnfangFiles() {
hashSetOfFiles = new HashSet<File>();
File f = new File(filePath);
for (File ff : f.listFiles()) {
hashSetOfFiles.add(ff);
}
}
private void chooseFilePath() {
//
// JFileChooser chooser = new JFileChooser();
// chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
//
// if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
// filePath = chooser.getSelectedFile().getAbsolutePath();
filePath = "C:\\Users\\maurice\\Desktop\\Test";
}
public static void main(String[] args) {
new WatchDir();
}
}
公共类WatchDir{
受保护的HashSet-hashsetofiles;
受保护的字符串filePath=“”;
公众监察主任(){
选择文件路径();
if(filePath.isEmpty())
返回;
listAnfangFiles();
新线程(){
公开募捐{
listNewFiles();
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
};
}.start();
}
私有void listNewFiles(){
文件文件=新文件(文件路径);
对于(文件f:File.listFiles()){
if(hashsetofiles.add(f)){
新发现的文件(f);
}
}
}
找到私有void newFileFound(文件f){
//他是新来的
System.out.println(f.getName());
}
私有void listAnfangFiles(){
hashSetOfFiles=新HashSet();
文件f=新文件(文件路径);
对于(文件ff:f.listFiles()){
hashsetofiles.add(ff);
}
}
私有void chooseFilePath(){
//
//JFileChooser chooser=新的JFileChooser();
//setFileSelectionMode(仅限于JFileChooser.DIRECTORIES_);
//
//if(chooser.showOpenDialog(null)=JFileChooser.APPROVE\u选项)
//filePath=chooser.getSelectedFile().getAbsolutePath();
filePath=“C:\\Users\\maurice\\Desktop\\Test”;
}
公共静态void main(字符串[]args){
新WatchDir();
}
}
它不是一条连续的线。
在run()
方法中,没有允许线程继续连续运行的循环条件。So
sleep(1000)代码>播放一次,它是run()
方法中最后一条播放的指令。返回后,run()
方法终止,因此线程结束
编辑:具有连续线程的简单解决方案
例如,此代码允许线程永不停止,但允许进程终止:
new Thread() {
public void run() {
while (true){
listNewFiles();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
您可以有其他条件来停止循环(延迟、日期或时间、状态、按键等)。若要允许,应将其置于while()
条件中,或置于块中(如果(条件)中断
)
boolean wantToContinue = true;
new Thread() {
public void run() {
while (wantToContinue){
listNewFiles();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
它不是一条连续的线。
在run()
方法中,没有允许线程继续连续运行的循环条件。
Sosleep(1000)代码>播放一次,它是run()
方法中最后一条播放的指令。返回后,run()
方法终止,因此线程结束
编辑:具有连续线程的简单解决方案
例如,此代码允许线程永不停止,但允许进程终止:
new Thread() {
public void run() {
while (true){
listNewFiles();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
您可以有其他条件来停止循环(延迟、日期或时间、状态、按键等)。若要允许,应将其置于while()
条件中,或置于块中(如果(条件)中断
)
boolean wantToContinue = true;
new Thread() {
public void run() {
while (wantToContinue){
listNewFiles();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
使用布尔变量。因此,您可以从外部控制操作。提供真实的条件不是好的做法
使用布尔变量。因此,您可以从外部控制操作。提供真实的条件不是好的做法