java多线程队列问题 本帖最后由 wentshop 于 2012-05-24 23:38:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 多线程时,最好采用阻塞式队列(ArrayBlockingQueue,LinkedBlockingQueue, ....),或者自己写同步方法。不要采用while(true)来读取队列,设置一个flag,当退出时把flag设置为false。如果采用阻塞式队列,退出时一定要往队列里多添加一条数据,用于退出阻塞的队列。 class Manager implements Runnable { private static BlockingQueue<Person> persons = new LinkedBlockingQueue<Person>(); private static BlockingQueue<String> names = new LinkedBlockingQueue<String>(); private static boolean flag = true; public static void addPerson(Person person) { try { persons.put(person); } catch (InterruptedException e) { e.printStackTrace(); } } public static void addName(String name) { try { names.put(name); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void run() { while (flag) { System.out.println("现在有多少个人需要取名:" + persons.size()); System.out.println("现在有多少个名字:" + names.size()); try { persons.take().setName(names.take()); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void exit() { persons.clear(); names.clear(); flag = false; addPerson(new Person()); addName(""); }} name最好不用阻塞队列,persons中有数据,name无数据或者name有数据,persons无数据都会导致persons.take().setName(names.take());阻塞。 persons 和 nases 都是 有弹性的,这是的names代表数据库连接池里的连接,persons代表用户,我QQ:8738115 你加我 我把我写的代码发给你 你看看 3Q java se小程序 java 大数相加减 高分求解~~~~~~~~~~~~~~ 编程时遇到这个问题:怎样把一个表的值插入到另一个表中(文中有代码) 0.0001为什么输出时是1.0E-4 迭代器输出问题 关于applet中的安全问题! 测试servlet程序,需要在Tomacat中设置哪些内容?谢谢 怎样能控制小数点后的位数 谢谢 jvm出现致命错误,出现hs_err_pid*.log 计算每个顾客消费额的波峰和波谷 请教一个递归问题 简单的线程问题
class Manager implements Runnable {
private static BlockingQueue<Person> persons = new LinkedBlockingQueue<Person>();
private static BlockingQueue<String> names = new LinkedBlockingQueue<String>();
private static boolean flag = true;
public static void addPerson(Person person) {
try {
persons.put(person);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void addName(String name) {
try {
names.put(name);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
public void run() {
while (flag) {
System.out.println("现在有多少个人需要取名:" + persons.size());
System.out.println("现在有多少个名字:" + names.size());
try {
persons.take().setName(names.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void exit()
{
persons.clear();
names.clear();
flag = false;
addPerson(new Person());
addName("");
}
}
name最好不用阻塞队列,persons中有数据,name无数据或者name有数据,persons无数据都会导致
persons.take().setName(names.take());阻塞。