我是 Spring 新手,我不喜欢使用 .xml 作为 spring 配置。所以我只想使用注释。以下是我的测试代码,它在没有 spring 的情况下运行良好,但是如果我使用 DI 并添加注释“@Resource”,我会得到 NullPointException,任何人都可以帮忙解决它,非常感谢。
我已经导入了相关的 spring 罐子。这是一个生产者-消费者的情况,我想将资源池注入生产者和消费者。
生产者.java
import javax.annotation.Resource;
public class Producer implements Runnable{
@Resource
private ResourcePool qs;
@Override
public void run() {
while (true) {
for(int i = 0;i < Integer.MAX_VALUE; i++) {
try {
qs.produce(i);
System.out.println("Add index = " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
消费者.java
import javax.annotation.Resource;
public class Consumer implements Runnable {
@Resource
private ResourcePool qs;
@Override
public void run() {
while(true) {
for (int i = 0; i < 5; i++) {
try {
System.out.println("Remove index = " + qs.comsume());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
资源池.java
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ResourcePool {
private BlockingQueue<Integer> aBlockingQueue = new ArrayBlockingQueue<Integer>(11);
public void produce(Integer ins) throws InterruptedException{
aBlockingQueue.put(ins);
}
public int comsume() throws InterruptedException{
return aBlockingQueue.take();
}
}
主要功能
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestPC {
public static void main(String[] args){
ExecutorService aExecutor = Executors.newFixedThreadPool(2);
Producer productor = new Producer();
Consumer consumer = new Consumer();
aExecutor.execute(productor);
aExecutor.execute(consumer);
}
}
异常消息:
线程“pool-1-thread-2”中的异常 java.lang.NullPointerException
在 testbq.Consumer.run(Consumer.java:14) 处
java.util.concurrent.ThreadPoolExecutor.runWorker(来源未知)位于
java.util.concurrent.ThreadPoolExecutor$Worker.run(来源未知)
java.lang.Thread.run(未知来源)线程中的异常
“pool-1-thread-1”java.lang.NullPointerException at
testbq.Producer.run(Producer.java:14) 在
java.util.concurrent.ThreadPoolExecutor.runWorker(来源未知)位于
java.util.concurrent.ThreadPoolExecutor$Worker.run(来源未知)
java.lang.Thread.run(来源不明)
Thanks