线程类里面报空指针错误,一开始我以为是传的参数有问题,打了断点,debug却进不去,然后输出了一下service和传参,终于发现了原因。
================================>null
================================>CommonRegionTownsVo(channelNbr=null, staffCode=null, xCtgProvinceId=null, xCtgLanId=null, commonRegionId=xxxxxxxxx, )
Exception in thread "Thread-98" java.lang.NullPointerException
at org.springblade.xxxxxx.xxxxxx.xxxx.run(CommonRegionTownsThread.java:92)
at java.lang.Thread.run(Thread.java:748)
线程类里的service是空的,参数是有的。
我首先想到的是new这个service,虽然这个serv是有了,不为空,但是service的实现类里面的mapper却又变成空的。于是意识到了这样做下去势必会影响到其他方法,于是换了其他的办法。
框架用的是springboot,于是我便将这个线程类放到容器里面管理,思考了一下应该是service是容器管理的,这个线程类里面service 是new出来的,两者冲突就报了空指针这个错。
于是便将这个线程类加注解@Component ,由spring容器管理
然后注入这个service`
@Autowired
private IDzChannelService dzChannelService;
这个空指针异常便解决了
总结原因就是spring容器管理与new这个类冲突了,解决办法就是放到spring容器管理
另外补充一下往线程里传参数的方法,参考网上的方法,因为一开始这个线程类是通过构造方法往里传的,然后交由spring容器管理就换了传参的方法
向线程中传递数据的三种方法:
一、通过构造函数传递参数
public class MyThread1 extends Thread
{
private String name;
public MyThread1(String name)
{
this.name = name;
}
public void run()
{
System.out.println("hello " + name);
}
public static void main(String[] args)
{
Thread thread = new MyThread1("world");
thread.start();
}
}
二、通过变量和方法传递数据
public class MyThread2 implements Runnable
{
private String name;
public void setName(String name)
{
this.name = name;
}
public void run()
{
System.out.println("hello " + name);
}
public static void main(String[] args)
{
MyThread2 myThread = new MyThread2();
myThread.setName("world");
Thread thread = new Thread(myThread);
thread.start();
}
}
三、通过回调函数传递数据
class Data
{
public int value = 0;
}
class Work
{
public void process(Data data, Integer numbers)
{
for (int n : numbers)
{
data.value += n;
}
}
}
public class MyThread3 extends Thread
{
private Work work;
public MyThread3(Work work)
{
this.work = work;
}
public void run()
{
java.util.Random random = new java.util.Random();
Data data = new Data();
int n1 = random.nextInt(1000);
int n2 = random.nextInt(2000);
int n3 = random.nextInt(3000);
work.process(data, n1, n2, n3); // 使用回调函数
System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
+ String.valueOf(n3) + "=" + data.value);
}
public static void main(String[] args)
{
Thread thread = new MyThread3(new Work());
thread.start();
}
}