请注意,在不同的
这是我用来实现队列的代码。在这里,即使队列不是空的,队列轮询也总是返回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();
此外,正如其他答案中所建议的那样,同步化是必要的。