旁门左道第二章之障碍器

旁门左道第二章之障碍器
原文: 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( 4 new  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  }


你可能感兴趣的:(旁门左道第二章之障碍器)