java中的linkedlist队列无法与线程一起工作



这是我用来实现队列的代码。在这里,即使队列不是空的,队列轮询也总是返回null。

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();
}

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

ExecutorService有一个内置队列。您可以利用它,而根本不创建自己的队列。只需在需要完成某些任务时执行(可运行(任务。

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

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

请注意,在不同的queue上调用offer()poll()-offer()queue是局部变量,而poll()的可能是一个字段:
Queue queue = new LinkedList(); 

此外,正如其他答案中所建议的那样,同步化是必要的。

相关内容

  • 没有找到相关文章

最新更新