2015-10-05 49 views
-1

我的课程使用第三方库类来完成一项工作。一般来说,我初始化第三方库类,这反过来又触发回调方法:由于某种原因,线程变量被隐式设置为空

public class MyJob { 

    private Thread myThread; 
    private ThirdPartyService mThirdParty; 

    public MyJob() {…} 

     public void start() { 
    //get an instance of 3rd party class 
      mThirdParty = ThirdParty.getInstance(); 

      //create an instance of 3rd party callback 
      ThirdPartyCallBack callback = new ThirdPartyCallBack() { 
       @Override 
       public void onInitSuccess() { 
         if (null == myThread) { 
          myThread = new Thread(); 
          System.out.println(“myThread is created in callback!”); 

          //do tasks… 
         } 
       } 
      }; 

      System.out.println(“mThirdParty.init() …”); 
      mThirdParty.init(callback); 

      //myThread is null here when call start() the 2nd time, why? 
      if (myThread == null) { 
       System.out.println(“After mThirdParty.init(), myThread is NULL!”); 
      } else { 
       System.out.println(“After mThirdParty.init(), myThread is NOT NULL!”); 
      } 
     } 

     public void stop() { 
      myThread.join(); 
      myThread = null; 
      System.out.println(“stopped!”); 
     } 
} 

正如你看到的上面的mThirdParty.init(callback)触发onInitSuccess()执行的回调方法。

代码使用MyJob类:

MyJob job = new MyJob(); 
job.start(); 
Thread.sleep(5000); 
job.stop(); 
Thread.sleep(5000); 
job.start(); 

我第一次开始工作,每一件事情是在这里很好,控制台打印以下日志:

mThirdParty.init() … 
myThread is created in callback! 
After mThirdParty.init(), myThread is NOT NULL! 

5秒钟后,我打电话停止(),日志显示:

stopped! 

后5秒,再次启动工作,日志显示:

mThirdParty.init() … 
myThread is created in callback! 
After mThirdParty.init(), myThread is NULL! 

为什么在我第二次启动工作之后,我的myThread是NULL?难道第三方库已经以某种方式隐式地将其设置为null?

+0

你如何看待第三方库的源代码? –

+0

这是真实的代码吗?因为'myThread = new Thread();'是无用的。还是你在项目中创建了一个名为Thread的类? –

+0

它不是真正的代码,我只是试图展示我的代码的一般逻辑 – user842225

回答

0

好吧,“第三方库”是你自己的代码。

public void stop() { 
     myThread.join(); 
     myThread = null; 
     System.out.println(“stopped!”); 
    } 

您在调用stop()时将其设置为null。


好像你有内存同步问题。将volatile添加到myThread

private volatile Thread myThread

+0

但是,如果你仔细看到日志信息,调用'job.start()'时创建'myThread',我的意思是回调初始化myThread。我已经看到myThread被初始化,然后下面的日志显示myThread再次为空。这是我不明白的事情。 – user842225

+1

@ user842225将'volatile'添加到myThread中。 –

+0

添加volatile后出现同样的问题 – user842225

相关问题