public void resetScore() { /* * score.set 与char2type.set这两个方法,虽然没有以原子的方式执行完成,但是 却不影响整个类的安全性,因为这两个方法没有相互依赖,只需保证单个方法以原子的方式执行即可, 这个情况与 java并发编程中的因式分解那个例子不同, */ score.set(0); char2type.set(-1); setScore(); }
static void oneRun(BlockingQueue<Runnable> q, int nThreads, int iters, boolean print) throws Exception { ThreadPoolExecutor pool = new ThreadPoolExecutor(nThreads + 1, Integer.MAX_VALUE, 1L, TimeUnit.SECONDS, q); CountDownLatch done = new CountDownLatch(iters); remaining.set(nThreads - 1); pool.prestartAllCoreThreads(); Task t = new Task(pool, done); long start = System.nanoTime(); pool.execute(t); done.await(); long time = System.nanoTime() - start; if (print) System.out.println("\t: " + LoopHelpers.rightJustify(time / iters) + " ns per task"); q.clear(); Thread.sleep(100); pool.shutdown(); Thread.sleep(100); pool.shutdownNow(); }
/** {@inheritDoc} */ @Override public void onCollision( Collection<GridCollisionJobContext> waitJobs, Collection<GridCollisionJobContext> activeJobs) { assert waitJobs != null; assert activeJobs != null; int activeSize = F.size(activeJobs, RUNNING_JOBS); waitingCnt.set(waitJobs.size()); runningCnt.set(activeSize); heldCnt.set(activeJobs.size() - activeSize); int waitSize = waitJobs.size(); int activateCnt = parallelJobsNum - activeSize; if (activateCnt > 0 && !waitJobs.isEmpty()) { if (waitJobs.size() <= activateCnt) { for (GridCollisionJobContext waitJob : waitJobs) { waitJob.activate(); waitSize--; } } else { List<GridCollisionJobContext> passiveList = new ArrayList<GridCollisionJobContext>(waitJobs); Collections.sort( passiveList, new Comparator<GridCollisionJobContext>() { /** {@inheritDoc} */ @Override public int compare(GridCollisionJobContext o1, GridCollisionJobContext o2) { int p1 = getJobPriority(o1); int p2 = getJobPriority(o2); return p1 < p2 ? 1 : p1 == p2 ? 0 : -1; } }); if (preventStarvation) bumpPriority(waitJobs, passiveList); for (int i = 0; i < activateCnt; i++) { passiveList.get(i).activate(); waitSize--; } } } if (waitSize > waitJobsNum) { List<GridCollisionJobContext> waitList = new ArrayList<GridCollisionJobContext>(waitJobs); // Put jobs with highest priority first. Collections.sort( waitList, new Comparator<GridCollisionJobContext>() { /** {@inheritDoc} */ @Override public int compare(GridCollisionJobContext o1, GridCollisionJobContext o2) { int p1 = getJobPriority(o1); int p2 = getJobPriority(o2); return p1 < p2 ? 1 : p1 == p2 ? 0 : -1; } }); int skip = waitJobs.size() - waitSize; int i = 0; for (GridCollisionJobContext waitCtx : waitList) { if (++i >= skip) { waitCtx.cancel(); if (--waitSize <= waitJobsNum) break; } } } }
public void run() { long start, end; // Start timer start = System.currentTimeMillis(); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); myint.set(50); end = System.currentTimeMillis(); System.out.println( "W contention on atomic " + (end - start) + " ms BID: " + VM.getIsland() + " CID: " + VM.getCore()); }