这是我用来实现队列的代码。 这里队列轮询总是返回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();
}
答案 0 :(得分:1)
LinkedList是唯一的非线程安全队列。任何其他实施都是更好的选择。您的优惠不同步。 ;)
ExecutorService有一个内置队列。您可以使用它,而不是创建自己的队列。只需执行(Runnable)任务就可以完成任务。
答案 1 :(得分:0)
那是因为你没有为queue.offer()同步队列。您需要同步对队列的所有访问权限。
最简单的方法是使用LinkedBlockingQueue来处理所有同步。
答案 2 :(得分:0)
请注意,您在不同的offer()
上致电poll()
和queue
- offer()
queue
的{{1}}是本地变量,而{{1}一个可能是一个字段:
poll()
此外,还需要进行同步化,如其他答案所示。