本帖最后由 wentshop 于 2012-05-24 23:38:47 编辑

解决方案 »

  1.   

    多线程时,最好采用阻塞式队列(ArrayBlockingQueue,LinkedBlockingQueue, ....),或者自己写同步方法。不要采用while(true)来读取队列,设置一个flag,当退出时把flag设置为false。如果采用阻塞式队列,退出时一定要往队列里多添加一条数据,用于退出阻塞的队列。
      

  2.   


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

  3.   


    name最好不用阻塞队列,persons中有数据,name无数据或者name有数据,persons无数据都会导致
    persons.take().setName(names.take());阻塞。
      

  4.   

    persons  和 nases 都是 有弹性的,这是的names代表数据库连接池里的连接,persons代表用户,我QQ:8738115 你加我  我把我写的代码发给你 你看看 3Q