【问题标题】:Threads in Java getting NullPointerExceptionJava中的线程获取NullPointerException
【发布时间】:2013-05-14 12:28:53
【问题描述】:

我只是想在 java 中调用一个线程。我想检查线程是否被中断。线程在“调度程序”类中定义。代码如下:

        if (flag == true) 
        {
        thread = new Scheduler();
        thread.start();
        } 

        else 
        {
        thread.interrupt();
        }

        public void run() 
        {
            while (thread.isInterrupted() != true) // Here i get a NPE...
           { 
             //....
           }
        }

【问题讨论】:

  • 请提供更大的代码 sn-p。 thread 字段在哪里定义等并不明显。
  • 异常的完整堆栈跟踪和更多代码将很有用。
  • 请停止写(booleanCondition != true)。每次你这样做,小猫都会哭。

标签: java multithreading simulation interrupt


【解决方案1】:

首先,由于flag是一个布尔值,你可以简单地写:

  if (flag) 
    {
        thread = new Scheduler();
        thread.start();
    } 

 else 
    {
        thread.interrupt();
    }

我相信您的问题是该标志的计算结果为 false,并且您最终在空对象上调用 isInterrupted()。您也很可能指的是与您认为的完全不同的线程。目前尚不清楚您指的是哪个对象-您需要发布更多代码。

还有:

while (!thread.isInterrupted()) // isInterrupted() returns a boolean, you don't need != true
   { 
             //....
   }

【讨论】:

  • 如果标志是false,则在调用thread.interrupt(); 时需要NPE。此外,在这种情况下,不会创建线程,因此不会执行其run() 方法。
  • 是的,我也很困惑。我的假设是他还没有测试那部分代码或者我们没有的代码中的某个地方类似于if(!flag) 初始化线程。
【解决方案2】:

您获得NullPointerException 的原因可能是因为该变量未初始化,因为flagif 语句中为假,但我认为这不是问题的根源.

如果你想检查被调用的线程是否被中断,你应该使用

while (!this.isInterrupted()) {

在您的 sn-p 中,您似乎正在测试另一个 Scheduler 对象。

【讨论】:

    【解决方案3】:

    是来自调度程序的 run() 代码 sn-p 吗?在运行中为什么你有 thread.isInterrupted() ?而是使用

    Thread.currentThread().isInterrupted()
    

    还可以看看构造函数和线程变量的声明位置

    【讨论】:

      猜你喜欢
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2010-12-27
      • 1970-01-01
      相关资源
      最近更新 更多