如何在一个线程处于睡眠模式时实现多线程

时间:2013-01-18 14:33:43

标签: java multithreading threadpool

我遇到一个问题,我的类正在执行第一个run方法,之后它没有进入第二个重载的run方法。

程序执行在一个控制器类中,它有一个main方法和一个线程池:

public class RunnableController {
    // Main method
    public static void main(String[] args) throws InterruptedException {
        try {
            RunnableController controller = new RunnableController();
            controller.initializeDb();
            controller.initialiseThreads();
            System.out.println("Polling");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void initialiseThreads() {      
        try {
            threadExecutorRead = Executors.newFixedThreadPool(10);
            PollingSynchronizer read = new PollingSynchronizer(incomingQueue, dbConncetion);
            threadExecutorRead.submit(read);
        } catch (Exception e){
            e.printStackTrace();
        }   
    }
}

我的poller类获取新数据并且应该模拟更新:

public class PollingSynchronizer implements Runnable {
   public PollingSynchronizer(Collection<KamMessage> incomingQueue,
         Connection dbConnection) {
      super();
      this.incomingQueue = incomingQueue;
      this.dbConnection = dbConnection;
   }

   private int seqId;

   public int getSeqId() {
      return seqId;
   }

   public void setSeqId(int seqId) {
      this.seqId = seqId;
   }

   // The method which runs Polling action and record the time at which it is done
   public void run() {
      int seqId = 0;

      while (true) {
         List<KamMessage> list = null;

         try {
            list = fullPoll(seqId);

            if (!list.isEmpty()) {
               seqId = list.get(0).getSequence();
               incomingQueue.addAll(list);
               this.outgoingQueue = incomingQueue;
               System.out.println("waiting 3 seconds");
               System.out.println("new incoming message");
               Thread.sleep(3000);//at this wait I should execute run()

               //when I debug my execution stops here and throws " Class not found Exception "
               // its does not enters the message processor class 
               MessageProcessor processor = new MessageProcessor() {
                  //the run method which should fetch the message processor class.
                  final public void run() {
                     MessageProcessor(outgoingQueue).generate(outgoingQueue);
                  }
               };
              new Thread(processor).start();
            }
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
   }
}

我的消息处理器类:

public abstract class MessageProcessor implements Runnable {
   private Connection dbConnection;
   Statement st = null;
   ResultSet rs = null;
   PreparedStatement pstmt = null;
   private Collection<KamMessage> outgoingQueue;

   public KamMsg804 MessageProcessor(Collection<KamMessage> outgoingQueue,
         Connection dbConnection) {
      this.outgoingQueue = outgoingQueue;
      this.dbConnection = dbConnection;
      return (KpiMsg804) fetchedMessages;
   }

   public Collection<KamMessage> generate(Collection<KamMessage> outgoingQueue) {
      while (true) {
         try {
            while (rs.next()) {
               KamMessage filedClass = convertRecordsetToPojo(rs);
               outgoingQueue.add(filedClass);
            }

            for (KamMessage pojoClass : outgoingQueue) {
               KamMsg804 updatedValue = createKamMsg804(pojoClass);
               System.out.print(" " + pojoClass.getSequence());
               System.out.print(" " + pojoClass.getTableName());
               System.out.print(" " + pojoClass.getAction());
               System.out.print(" " + updatedValue.getKeyInfo1());
               System.out.print(" " + updatedValue.getKeyInfo2());
               System.out.println(" " + pojoClass.getEntryTime());
            }
            return outgoingQueue;
         } catch (SQLException e) {
            e.printStackTrace();
         }
      }
   }
}

我的问题恰好是第二次运行(我在MessageProcessor类中获得异常的9方法,它循环回Polling。

  1. 如何在这里实现多线程,就像线程在轮询中睡3个seoc时一样,它应该同时更新数据库。
  2. 之后,如何将数据馈送并更新回数据库。
  3. 我的程序流程 - 我有三个类:  1.Controller  2.PollerSynchro  3.Msgprocessor

    我有数据库记录,它们被转换为POJO形式并存储在Collection中。有了这些POJO,我的课程就会尝试在一段时间内进行多处理和更新。

    1. 控制器 - 有线程池,用poll方法启动poller类 - 完成

    2. Poller - 应该轮询新的传入消息并将其存储在传入队列中 - 完成

    3. MsgProcessor - 应该查找新的传入消息并将它们从传出队列传递到传入队列 - 也已完成

    4. 问题:

      现在我的问题是

      1. 我必须在poll线程休眠3秒时实现此更新,

      2. 在Poller类中第二个void run()方法的代码中,传递队列未传递并传递给messageprocessor类进行更新。我的执行流程只是循环回到第一个运行方法,并且正在获得Class异常。

      3. 请帮我解决这些问题。

1 个答案:

答案 0 :(得分:3)

我不能涂这个,你的代码很乱。但是,至于您的消息处理器代码没有被执行的原因,您实际上从未实际启动使用此代码创建的线程:

MessageProcessor processor = new MessageProcessor() {
    // the run method which should fetch the message processor class.
    final public void run() {
         MessageProcessor(outgoingQueue).generate(outgoingQueue);                    
    }
};

忽略被调用的容易混淆的方法,你的代码看起来应该更像这样:

Message processor = new MessageProcessor() {
    // the run method which should fetch the message processor class.
    final public void run() {
         MessageProcessor(outgoingQueue).generate(outgoingQueue);                    
    }
};

new Thread(processor).start();