线程没有执行

时间:2017-10-30 20:04:04

标签: java multithreading

运行程序时,此线程不会执行。我想知道代码是否有问题。

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()调用之后将该分号放在第二个大括号旁边?

3 个答案:

答案 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();
    }
}