2011-05-03 30 views
0

这是我用来实现队列的代码。 这里队列轮询总是返回null,即使队列不是空的。linkedlist java中的队列不能与线程一起使用

Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     service.schedule(runnable, 500, TimeUnit.MILLISECONDS); 
     process(); 
    } 

    public void process() { 
     try { 
      String tt = nextItem(); 
      //System.out.println("SQ:"+tt); 
     } catch (Exception e) {//Catch exception if any 
      System.out.println("2Error: " + e.getMessage()); 
     } 
    } 
}; 

public String nextItem() { 
    Object poll; 
    try { 
     synchronized (queue) { 
      System.out.println("SQ:" + queue.poll()); 
      //if (poll != null) { 
      // return poll.toString(); 
      //} else { 
      return ""; 
      //} 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return ""; 
    } 
} 

public void run() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     String url = 
       "jdbc:mysql://1xxx:3306/ayan"; 
     Connection con = 
       DriverManager.getConnection(
       url, "[user]", "[pass]"); 

     Queue queue = new LinkedList(); 
     service = Executors.newScheduledThreadPool(1000); 
     service.schedule(runnable, 0, TimeUnit.MILLISECONDS); 
     while (true) { 
      Statement statement = con.createStatement(); 
      statement.setFetchSize(1); 
      ResultSet resultSet = statement.executeQuery("SELECT * from query_q"); 
      while (resultSet.next()) { 
       // process results. each call to next() should fetch the next row 
       String id = resultSet.getString("id"); 
       String query = resultSet.getString("query"); 
       String msisdn = resultSet.getString("msisdn"); 
       String pass = id + "|" + query + "|" + msisdn; 
       System.out.println("MQ:" + pass); 
       //String str = "foo"; 
       //Queue<Character> charsQueue = new LinkedList<Character>(); 
       boolean inserted = false; 
       for (char c : pass.toCharArray()) { 
        inserted = queue.offer(c); 
       } 

       if (inserted != false) { 
        // Statement stats = con.createStatement(); 
        //stats.executeUpdate("delete from query_q where id=" + id); 
       } 
      } 
      Thread.sleep(10000); 
     } 
     //con.close(); 
} 
+0

您是否可以创建一个紧凑的测试用例来说明问题? – gd1 2011-05-03 16:56:40

+0

_reads_和_writes_都需要'synchronized'。 – mre 2011-05-03 16:57:01

回答

1

LinkedList是唯一的非线程安全队列。任何其他实现将是更好的选择。您的报价不同步。 ;)

ExecutorService具有内置队列。你可以使用它而不是创建你自己的队列。只需执行(Runnable)任务,因为您需要完成某些任务。

0

这是因为您没有为queue.offer()同步队列。您需要同步对队列的所有访问。

最简单的方法是使用LinkedBlockingQueue这将为您处理所有的同步。

0

请注意,您在不同的queue打电话offer()poll()的 - offer()queue是一个局部变量,而poll()的一个可能是一个领域:

Queue queue = new LinkedList(); 

此外,需要syncrhonization,正如其他答案中所建议的。