【问题标题】:Thread not executing [duplicate]线程未执行[重复]
【发布时间】:2017-10-30 20:04:03
【问题描述】:

当我运行程序时,这个线程没有执行。我想知道代码是否有问题。

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

【问题讨论】:

  • 您必须在创建线程对象后调用start。看看网上的一些线程示例!
  • 你没有开始你的话题。
  • 为什么要运行?您需要在Thread 上调用start 方法。看看文档Thread#start
  • 另外,为什么 NetBeans 想让我在 start() 调用之后将分号放在第二个花括号旁边?因为 new Thread() { ... }; 是一个语句。

标签: java multithreading


【解决方案1】:

启动一个线程

只有当您显式调用start方法时,您的线程才会启动。这是文档Thread#start。然后start 方法将在内部调用Thread 的run 方法。

您的代码可能如下所示:

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

您可能希望删除 run 方法中的 start(); 调用。


分号

在创建Thread 之后,您需要;,因为您正在使用分配:

Thread fileWriter = new Thread() { ... };

您在这里使用的概念称为匿名类。基本上它就像创建一个新类一样:

public class FileWriter extends Thread  {
    @Override
    public void run() {
        ...
    }
}

然后像这样使用它:

Thread fileWriter = new FileWriter();

但是一个重要的区别是您的匿名类可以访问您的局部变量(该方法的范围)。而且它是匿名的,所以它就像一个小的单次使用类。

【讨论】:

    【解决方案2】:

    您对start 方法的调用不能在线程主体内。你可以这样做:

    new Thread() {
        public void run() {
            try {
                writeToFile(saveState, fileName);
            } catch (IOException ex) {
    
            }
        }
    }.start(); // call the start method outside the body of you thread.
    

    关于分号,您正在创建一个匿名类,这就是它的syntax:

    因为匿名类定义是一个表达式,所以它必须是 声明的一部分......(这解释了为什么后面有分号 右大括号。)

    【讨论】:

    【解决方案3】:

    线程就是这样工作的。下面是一段代码,其中一个线程被创建为一个匿名内部类型,其中 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多