예제 #1
0
파일: Overlord.java 프로젝트: rf/bitster
  /** Selects on sockets and informs their Communicator when there is something to do. */
  public void communicate(int timeout) {

    try {
      selector.select(timeout);
    } catch (IOException e) {
      // Not really sure why/when this happens yet
      return;
    }

    Iterator<SelectionKey> keys = selector.selectedKeys().iterator();

    while (keys.hasNext()) {
      SelectionKey key = keys.next();
      keys.remove();
      if (!key.isValid()) continue; // WHY
      Communicator communicator = (Communicator) key.attachment();

      if (key.isReadable()) communicator.onReadable();
      if (key.isWritable()) communicator.onWritable();
      if (key.isAcceptable()) communicator.onAcceptable();
    }

    // Go through the queue and handle each communicator
    while (!queue.isEmpty()) {
      Communicator c = queue.poll();
      c.onMemo();
    }
  }
예제 #2
0
  public static void main(String[] args) {
    Date start = new Date();
    if (args.length < 3) {
      System.out.println("Wrong number of arguments:\n" + USAGE);
      return;
    }

    // get # threads
    int tc = Integer.parseInt(args[0]);
    String outfile = args[1];

    // make a threadsafe queue of all files to process
    ConcurrentLinkedQueue<String> files = new ConcurrentLinkedQueue<String>();
    for (int i = 2; i < args.length; i++) {
      files.add(args[i]);
    }

    // hastable for results
    Hashtable<String, Integer> results = new Hashtable<String, Integer>(HASH_SIZE, LF);

    // spin up the threads
    Thread[] workers = new Thread[tc];
    for (int i = 0; i < tc; i++) {
      workers[i] = new Worker(files, results);
      workers[i].start();
    }

    // wait for them to finish
    try {
      for (int i = 0; i < tc; i++) {
        workers[i].join();
      }
    } catch (Exception e) {
      System.out.println("Caught Exception: " + e.getMessage());
    }

    // terminal output
    Date end = new Date();
    System.out.println(end.getTime() - start.getTime() + " total milliseconds");
    System.out.println(results.size() + " unique words");

    // sort results for easy comparison/verification
    List<Map.Entry<String, Integer>> sorted_results =
        new ArrayList<Map.Entry<String, Integer>>(results.entrySet());
    Collections.sort(sorted_results, new KeyComp());
    // file output
    try {
      PrintStream out = new PrintStream(outfile);
      for (int i = 0; i < sorted_results.size(); i++) {
        out.println(sorted_results.get(i).getKey() + "\t" + sorted_results.get(i).getValue());
      }
    } catch (Exception e) {
      System.out.println("Caught Exception: " + e.getMessage());
    }
  }
예제 #3
0
 public void markForDeletion(File file) {
   TempFile tempFile = deleteMap.get(file.getPath());
   if (tempFile != null) {
     deleteQueue.remove(tempFile);
     deleteMap.remove(tempFile);
   } else {
     tempFile = new TempFile(file);
     deleteQueue.add(new TempFile(file));
     deleteMap.put(tempFile.getFile().getPath(), tempFile);
     file.deleteOnExit(); // just in case
   }
 }
예제 #4
0
 public void run() {
   Thread.currentThread().setName("deleteHelper");
   if (deleteQueue.size() > 0) {
     TempFile temp = deleteQueue.peek();
     if (temp != null && temp.getOld()) {
       logger.debug(
           "removing temporary file {tempfile='" + temp.getFile().getAbsolutePath() + "'}");
       deleteQueue.poll();
       deleteMap.remove(temp);
       try {
         temp.getFile().delete();
       } catch (Exception e) {
       }
     }
   }
 }
예제 #5
0
  public void run() {
    // each file is processed into a local hash table and then merged with the global results
    // this will cause much less contention on the global table, but still avoids a sequential
    // update
    Hashtable<String, Integer> local_results =
        new Hashtable<String, Integer>(WordCountJ.HASH_SIZE, WordCountJ.LF);
    // grab a file to work on
    String cf;
    while ((cf = files.poll()) != null) {
      try {
        BufferedReader input = new BufferedReader(new FileReader(cf));
        String text;
        // well go line-by-line... maybe this is not the fastest
        while ((text = input.readLine()) != null) {
          // parse words
          Matcher matcher = pattern.matcher(text);
          while (matcher.find()) {
            String word = matcher.group(1);
            if (local_results.containsKey(word)) {
              local_results.put(word, 1 + local_results.get(word));
            } else {
              local_results.put(word, 1);
            }
          }
        }
        input.close();
      } catch (Exception e) {
        System.out.println(" caught a " + e.getClass() + "\n with message: " + e.getMessage());
        return;
      }
      // merge local hashmap with shared one,could have a
      // seperate thread do this but that might be cheating

      Iterator<Map.Entry<String, Integer>> updates = local_results.entrySet().iterator();
      while (updates.hasNext()) {
        Map.Entry<String, Integer> kv = updates.next();
        String k = kv.getKey();
        Integer v = kv.getValue();
        synchronized (results) {
          if (results.containsKey(k)) {
            results.put(k, v + results.get(k));
          } else {
            results.put(k, v);
          }
        }
      }
      local_results.clear();
    }
  }
예제 #6
0
  public void handleNotification(INotification notification) {
    //		Logger.debug("@ClientMediator.handleNotification:noti="+notification.getBody());
    String noname = notification.getName();
    if (noname == Const.TICK) {
      if (destroyd) return;
      long t = TimerCmd.timeStamp;

      String[] ary;
      int st, ed;
      if (_lastRotTank != null) {
        ary = _lastRotTank.split(" ");
        st = Integer.parseInt(ary[0]);
        ed = st + Integer.parseInt(ary[6]);
        if (t <= ed && t >= st) {
          int ist = Integer.parseInt(ary[0]);
          if (_move.size() > 0) {
            st = Integer.parseInt(_move.peek().split(" ")[0]);
            while (st < ist && _move.size() > 0) {
              _move.poll();
              if (_move.size() == 0) break;
              st = Integer.parseInt(_move.peek().split(" ")[0]);
            }
          }
        }
      }
      if (_move.size() > 0) {
        ary = _move.peek().split(" ");
        st = Integer.parseInt(ary[0]);
        ed = st + Integer.parseInt(ary[8]);

        while ((t > ed) && _move.size() > 0) {
          //					Logger.debug("@TankMediator.handleNotification: t = " + t + " st = " + st + "
          // ed="+ed);
          String p = (String) _move.poll();
          Logger.debug("ClientMediator.TICK _move.poll=" + p);
          if (_move.size() == 0) break;
          ary = _move.peek().split(" ");
          st = Integer.parseInt(ary[0]);
          ed = st + Integer.parseInt(ary[8]);
        }

        if (_move.size() > 0) {
          String[] li = (String[]) _move.toArray(new String[0]);
          for (int i = li.length - 1; i >= 0; i--) {
            String s = li[i];
            ary = s.split(" ");
            st = Integer.parseInt(ary[0]);
            ed = st + Integer.parseInt(ary[8]);
            if (t <= ed && t >= st) {
              if (t == st) { // ed==st in this situation
                _state.x = (int) Float.parseFloat(ary[4]);
                _state.y = (int) Float.parseFloat(ary[5]);
                _nextX = _state.x;
                _nextY = _state.y;
              } else {
                float sx = Float.parseFloat(ary[4]);
                float ex = Float.parseFloat(ary[6]);
                float sy = Float.parseFloat(ary[5]);
                float ey = Float.parseFloat(ary[7]);
                double eco = 1.0 * (t - st) / (ed - st);
                _state.x = (int) (sx + (ex - sx) * eco);
                _state.y = (int) (sy + (ey - sy) * eco);
                double neco = 1.0 * (t + 1 - st) / (ed - st);
                _nextX = (sx + (ex - sx) * neco);
                _nextY = (sy + (ey - sy) * neco);
              }
              while (_move.size() > 1) _move.poll();
              break;
            }
          }
        }
      }
      if (_state != null) {
        ConcurrentHashMap<Integer, BulletState> bs =
            ((ServerBulletMediator) (appFacade().retrieveMediator(Const.SERVER_BULLET_MEDIATOR)))
                .getBullets();
        for (Enumeration enu = bs.keys(); enu.hasMoreElements(); ) {
          int id = (Integer) enu.nextElement();
          BulletState blt = bs.get(id);
          if (Texter.distance(blt.x, blt.y, _state.x, _state.y) < 16) {
            this.sendNotification(Const.BROAD_CAST, "destroy bullet " + id, null);
            _state.life -= 100;
            if (_state.life <= 0) {
              this.sendNotification(Const.BROAD_CAST, "destroy tank " + _state.tankID, null);
            } else {
              this.sendNotification(
                  Const.BROAD_CAST, "set-life tank " + _state.tankID + " " + _state.life, null);
            }
          }
        }
      }

      // barrier and tank
      if (_state != null) {
        // colision detection
        //				Logger.only("ClientMediator.handleNotification: x="+_state.x+" y="+_state.y+"
        // nx="+_nextX+" ny="+_nextY+" "+Texter.sqrareDis(_nextX, _nextY, 470, 200)+"
        // "+Texter.sqrareDis(_state.x, _state.y, 470, 200));
        if (!Arena.canGo(_state.x, _state.y, _nextX, _nextY)) {
          Arena.addReq(_id, Const.STOP_MOVE, getState());
        }
        for (Enumeration enu = AcceptCmd.clients.elements(); enu.hasMoreElements(); ) {
          ClientMediator cmm = (ClientMediator) enu.nextElement();
          if (cmm.destroyd) return;
          int cmid = cmm.getID();
          if (cmid == _id) continue;
          TankState ts = cmm.getState();
          if (ts == null) continue;
          double curdis = Texter.distance(ts.x, ts.y, _state.x, _state.y);
          double netdis = Texter.distance(ts.x, ts.y, _nextX, _nextY);
          if (curdis < 40 && netdis < curdis) {
            Arena.addReq(_id, Const.STOP_MOVE, getState());
            Arena.addReq(cmid, Const.STOP_MOVE, ts);
          }
        }
      }

      // handle delayed first
      //			ary=_delayOrder.toArray(new String[0]);
      //			_delayOrder.clear();
      //			for(int i=0;i<ary.length;i++){
      //				Logger.only("delayArray: "+ary[i]);
      //				int ttt=Integer.parseInt(ary[i].split(" ")[0]);
      //				if(ttt==t){
      //					tellClientWithTime(ary[i]);
      //				}else if(ttt>t){
      //					_delayOrder.add(ary[i]);
      //				}
      //			}

    } else if (noname == Const.BROAD_CAST) {
      String s = (String) notification.getBody();
      String ary[] = s.split(" ");

      if (notification.getType() == Const.NO_PREFIX) {
        tellClientWithTime(s);
        return;
      } else if (s.indexOf("talk") > -1) {
        tellClient(s, 0);
        return;
      }
      if (_id == Integer.parseInt(ary[2])) {
        if (s.indexOf("rotate-gun") > -1) {
          _lastRotateGun = TimerCmd.timeStamp + " " + s;
          if (_state != null) _state.gunAngle = Float.parseFloat(_lastRotateGun.split(" ")[5]);
        } else if (s.indexOf("move tank") > -1) {
          Logger.debug("ClientMediator: move add s=" + s);
          int offset = Integer.parseInt(notification.getType());
          if (offset == 0) _move.clear();
          _move.add((TimerCmd.timeStamp + offset) + " " + s);
        } else if (s.indexOf("create tank") > -1) {
          _state =
              new TankState(
                  _id,
                  ary[3],
                  Integer.parseInt(ary[6]),
                  (int) Float.parseFloat(ary[8]),
                  (int) Float.parseFloat(ary[9]),
                  Float.parseFloat(ary[10]),
                  Float.parseFloat(ary[11]));
          _state.printState();
        } else if (s.indexOf("rotate-tank") > -1) {
          _lastRotTank = TimerCmd.timeStamp + " " + s;
          if (_state != null) _state.tankAngle = Float.parseFloat(_lastRotTank.split(" ")[5]);
        } else if (s.indexOf("destroy tank") > -1) {
          this.destroyd = true;
        }
      }
      if (notification.getType() != null) tellClient(s, Integer.parseInt(notification.getType()));
      else tellClient(s, 0);
    }
  }
예제 #7
0
파일: Overlord.java 프로젝트: rf/bitster
 public void offer(Communicator c) {
   queue.offer(c);
 }