2013-11-09 71 views
2

所以我有两个文件,第一个是swing类,第二个是我的线程类。当我因为某种原因运行我的线程时,它不运行,我试着通过放置一些打印语句来查看我的程序是否会到达那里,但没有一个运行。程序没有执行线程

我的线程类

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

class CheckFiles implements Runnable { 

    public void run() { 

     while (!UserInterface.stop) { 
      try { 

       String line; 

       BufferedReader b = new BufferedReader(new FileReader(UserInterface.location)); 

       while((line = b.readLine()) != null) { 

        System.out.println(line); 

       } 

      } catch (IOException e) { System.out.println(e); } 
     } 
    } 
} 

在我的UserInterface I类通过执行以下操作

System.out.println(stop); //prints true 
loadFile.setEnabled(false); //not important 
status.setText("Checking Files"); //not important 
stop = false; 
System.out.println(stop); //prints false 
new CheckFiles(); //start thread 

启动方法本身就存在的东西是从运行停止我的线程还是我这样做错误?

+1

有点提示:确保'UserInterface.stop'是挥发性的,因为你在两个不同的线程中使用一个变量而没有同步。 – Vertex

回答

2

您正在创建一个可用于启动线程的类,但您并未开始它。

几种解决方案是可能的:

解决方案1:

更改类型延长Thread

class CheckFiles extends Thread { 
    ... 
} 

和最后一行更改为

(new CheckFiles()).start(); 

解决方案2:

保持CheckFiles一个Runnable,并在最后一行改为

(new Thread(new CheckFiles())).start(); 
+0

使它可以运行并扩展一个线程有什么区别? – user2612619

+0

@ user2612619'Runnable'是一个接口,如果您的线程类必须扩展其他一些类,则可以使用它。如果不需要扩展另一个类,则可以扩展'Thread'来简化其他代码。 – dasblinkenlight

1

在你只发类Runnable的时刻。你需要创建并开始你的线程。请看http://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html

Thread t = new Thread(new CheckFiles()); 
t.start(); 

延长线,并实现你的目标的Runnable之间的主要区别在于,扩展Thread当你与你所创建的对象的线程关联。通过使您的对象运行的,你可以到你的线程与许多Runnable对象关联..

1

您should'nt使课堂延伸线,而这样做

Thread t = new Thread(new CheckFiles()); 
t.start(); 
1

您刚才已经创建了一个实例应该是Thread的班级!您必须实际申报Thread并启动它。例如new Thread(new CheckFiles()).start();创建线程的实例,并启动它的对象。