public void run() {
        Collection deadPrj = new HashSet();
        while(true) {
            if(!projectileMap.isEmpty()) {
                Iterator it = projectileMap.keySet().iterator();
                synchronized(projectileMap) {
                    while(it.hasNext()) {
                        Object o = it.next();
                        assert(o instanceof Projectile);
                        if (!deadPrj.contains(o))
                            deadPrj.addAll(moveProjectile((Projectile)o));
                    }
                    it = deadPrj.iterator();
                    while(it.hasNext()) {
                        Object o = it.next();
                        assert(o instanceof Projectile);
                        Projectile prj = (Projectile)o;
                        projectileMap.remove(prj);
                        clientFired.remove(prj.getOwner());
                    }
                    deadPrj.clear();
                }
            }
            try {
                thread.sleep(200);
            } catch(Exception e) {
                // shouldn't happen
            }
        }
    }