java中的linkedlist队列不使用线程

时间:2011-05-03 16:51:16

标签: java queue linked-list scheduler

这是我用来实现队列的代码。 这里队列轮询总是返回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();
}

3 个答案:

答案 0 :(得分:1)

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

ExecutorService有一个内置队列。您可以使用它,而不是创建自己的队列。只需执行(Runnable)任务就可以完成任务。

答案 1 :(得分:0)

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

最简单的方法是使用LinkedBlockingQueue来处理所有同步。

答案 2 :(得分:0)

请注意,您在不同的offer()上致电poll()queue - offer() queue的{​​{1}}是本地变量,而{{1}一个可能是一个字段:

poll()

此外,还需要进行同步化,如其他答案所示。