[NKU]sweet @ Google && TopCoder && CodeForces

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks
          原文: Java線程:新特征-障礙器,這是該作者的原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則他將追究法律責任……

          Hmm……好怕怕,轉個日志都會被追究法律責任……

          不過要感謝原文的蘭州,在蘭州的文章幫助下,今天突然發現了靈感,改造了改造蘭州的代碼……
          在ACM中的作用,我覺得可以這樣:
          1:對于單文件多case的題,開多線程,每個線程跑一個case,之后再調用收尾的任務輸出
          2:對于單case且可以并行的情況,開若干線程處理之后,調用收尾函數來最后處理、輸出

          以下是一個簡單的求和代碼,實際效果,在我的雙核CPU上用時大概減少了一半

           1 import java.util.concurrent.BrokenBarrierException;
           2 import java.util.concurrent.CyclicBarrier;
           3 
           4 public class Test {
           5     public static int[] ans;
           6     void run() {
           7         ans = new int[4];
           8         int now = 0;
           9         for (int i = 0; i < 400000000; i++) {
          10             now = (now + i) % 9999997;
          11         }
          12         System.out.println(now);
          13         CyclicBarrier cb = new CyclicBarrier(4new MainTask());
          14         new SubTask(0,0,100000000,cb).start();
          15         new SubTask(1,100000000,200000000,cb).start();
          16         new SubTask(2,200000000,300000000,cb).start();
          17         new SubTask(3,300000000,400000000,cb).start();
          18     }
          19     public static void main(String[] args) {
          20         new Test().run();
          21     }
          22 }
          23 
          24 class MainTask implements Runnable {
          25     public void run() {
          26         int ans = 0;
          27         for (int i = 0; i < 4; i++) {
          28             ans = (ans + Test.ans[i]) % 9999997;
          29         }
          30         System.out.println(ans);
          31     }
          32 }
          33 
          34 class SubTask extends Thread {
          35     private int pos;
          36     private int left;
          37     private int right;
          38     private CyclicBarrier cb;
          39     final int mod = 9999997;
          40 
          41     SubTask(int pos,int left,int right,CyclicBarrier cb) {
          42         this.pos = pos;
          43         this.left = left;
          44         this.right = right;
          45         this.cb = cb;
          46     }
          47 
          48     public void run() {
          49         int ans = 0;
          50         for (int i = left; i < right; i++) {
          51             ans = (ans + i) % mod;
          52         }
          53         Test.ans[pos] = ans;
          54 
          55         try {
          56             cb.await();
          57         } catch (InterruptedException e) {
          58             e.printStackTrace();
          59         } catch (BrokenBarrierException e) {
          60             e.printStackTrace();
          61         }
          62     }
          63 }
          posted on 2011-04-06 12:36 sweetsc 閱讀(471) 評論(0)  編輯  收藏 所屬分類: ACM/ICPC學習心得
          主站蜘蛛池模板: 英德市| 汾阳市| 始兴县| 门源| 南华县| 卢湾区| 武城县| 博野县| 朝阳区| 阿拉善左旗| 会理县| 遵义县| 和平区| 永昌县| 呼伦贝尔市| 日照市| 吉安市| 芮城县| 汉中市| 龙山县| 永安市| 滨海县| 清河县| 得荣县| 遂昌县| 安多县| 兴化市| 夹江县| 乡宁县| 莱西市| 楚雄市| 北辰区| 宿迁市| 双峰县| 静宁县| 滦平县| 锡林郭勒盟| 漳平市| 横峰县| 淮北市| 泊头市|