【问题标题】:Creates new Thread with parameters使用参数创建新线程
【发布时间】:2017-11-29 13:37:47
【问题描述】:

CameraMessageFrameWorker 类中,我想创建一个新线程来处理一些消息。这些类的构造函数得到PartialMessageFrame。我将这些PartialMessageFrame 复制到新的private 变量messageFrame。有了这个变量,我想创建新的线程,但是当我想这样做时,我得到一个java.lang.IndexOutOfBoundsException,因为这个变量是null

我检查了构造函数中的messageFrame 变量是否获取了调用函数的数据。

我怎样才能把一些参数放到这个线程中?这段代码有什么问题?

CameraMessageFrameWorker.java

public class CameraMessageFrameWorker implements MessageFrameWorker {

  private static final Logger LOGGER = LoggerFactory.getLogger(CameraMessageFrameWorker.class);

  private final PartialMessageFrame messageFrame;
  private final SerialPort serialPort;

  public CameraMessageFrameWorker(
      final PartialMessageFrame p,
      final SerialPort serialPort) {
    messageFrame = p;
    this.serialPort = serialPort;
  }

  @Override
  public void run() {
    switch (messageFrame.getMessageType()) {
      case FCT: {
        handleFunction();
        break;
      }
      case REQ: {
        handleRequest();
        break;
      }
      default: {
        LOGGER.warn("unhandled message type");
        break;
      }
    }
  }

接口:MessageFramewoker.java

public interface MessageFrameWorker extends Runnable {
}

错误信息:

Exception in thread "pool-1-thread-1" java.lang.IndexOutOfBoundsException: Index: 9, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at com.scape.cx.service.draeger.polaris.simulator.PartialMessageFrame.getMessageTypeAsInt(PartialMessageFrame.java:56)
    at com.scape.cx.service.draeger.polaris.simulator.PartialMessageFrame.getMessageType(PartialMessageFrame.java:80)
    at com.scape.cx.service.draeger.polaris.simulator.CameraMessageFrameWorker.run(CameraMessageFrameWorker.java:39)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 贴出相关代码和错误信息详情。

标签: java multithreading threadpool java-threads


【解决方案1】:

为了解决这个问题,我必须先从这个messageFrame 做一个深拷贝,然后再把它放到这个CameraMessageFrameWorker 中。

请参阅此处以从 ArrayList 制作深层副本 How to clone ArrayList and also clone its contents?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2012-10-19
    • 1970-01-01
    • 2012-06-06
    • 2016-08-17
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多