运行程序时,此线程不会执行。我想知道代码是否有问题。
public static void writeToFileAsync(final String saveState, final String fileName) {
new Thread() {
public void run() {
try {
writeToFile(saveState, fileName);
} catch (IOException ex) {
}
start();
}
};
}
另外,为什么NetBeans要求我在start()
调用之后将该分号放在第二个大括号旁边?
答案 0 :(得分:3)
只有在您明确调用start
方法 时才会启动您的主题。这是文档Thread#start。然后,start
方法将在内部调用run
的{{1}}方法。
您的代码可能如下所示:
Thread
您可能希望删除public static void writeToFileAsync(final String saveState, final String fileName) {
// Create the thread
Thread fileWriter = new Thread() {
@Override
public void run() {
try {
writeToFile(saveState, fileName);
} catch (IOException ex) {
// Do nothing
}
}
};
// Start the thread
fileWriter.start();
}
方法中的start();
来电。
创建run
后需要;
,因为您正在使用作业:
Thread
您在此处使用的概念称为匿名类。基本上它与创建一个新类相同:
Thread fileWriter = new Thread() { ... };
然后使用它:
public class FileWriter extends Thread {
@Override
public void run() {
...
}
}
然而,一个重要的区别是您的匿名类可以访问您的局部变量(该方法的范围)。并且它是匿名,所以它就像一个小的一次性使用类。
答案 1 :(得分:1)
您对new Thread() {
public void run() {
try {
writeToFile(saveState, fileName);
} catch (IOException ex) {
}
}
}.start(); // call the start method outside the body of you thread.
方法的调用不能在您的主题内部。你可以这样做:
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //get request method
if r.Method == "GET" {
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, nil)
} else {
fmt.Println("username:", r.FormValue("username"))
fmt.Println("password:", r.FormValue("password"))
}
}
关于分号,你正在创建一个匿名类,那就是它的syntax:
因为匿名类定义是表达式,所以它必须是 声明的一部分...(这解释了为什么之后有分号 结束括号。)
答案 2 :(得分:0)
线程只是这样工作。下面是一段代码,其中一个线程被创建为匿名内部类型,其中run方法被覆盖。然后通过调用start方法,它会自动调用覆盖的run方法。
public class ThreadTest {
Thread t = new Thread(){
public void run() {
System.out.println("thread is running");
};
};
public static void main(String[] args) {
ThreadTest threadTest = new ThreadTest();
threadTest.t.start();
}
}