Advertisement
tomas862

stackoveflow java jcp threads paprastesnis

Jan 24th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.63 KB | None | 0 0
  1. package ilginist_l3g;
  2.  
  3. import org.jcsp.lang.Alternative;
  4. import org.jcsp.lang.AltingChannelInput;
  5. import org.jcsp.lang.Any2OneChannel;
  6. import org.jcsp.lang.CSProcess;
  7. import org.jcsp.lang.Channel;
  8. import org.jcsp.lang.ChannelOutput;
  9. import org.jcsp.lang.Guard;
  10. import org.jcsp.lang.One2OneChannel;
  11. import org.jcsp.lang.Parallel;
  12. import org.jcsp.lang.SharedChannelOutput;
  13. import org.jcsp.util.InfiniteBuffer;
  14.  
  15.  
  16. // Programoje naudojau One2One kanala Rasytojas -> Valdytojas, nes naudojant viena kanala Any2One
  17. // programa per greit pasibaigdavo ir visus veiksmus atlikdavo viena gija
  18. // Naudojant alternative metoda fairSeletect gijos priverciamos veikti pasikeisdamos, todel visas darbas nelieka vienai gijai
  19. public class IlginisT_L3g {
  20.    
  21.     private static Parallel parallel = new Parallel();
  22.    
  23.     public void execute(){
  24.         One2OneChannel[] writerToManager = Channel.one2oneArray(3, new InfiniteBuffer());
  25.         One2OneChannel[] managerToReader = Channel.one2oneArray(2, new InfiniteBuffer());
  26.        
  27.         Any2OneChannel workFinished = Channel.any2one(new InfiniteBuffer());
  28.        
  29.         parallel.addProcess(new ControllerThread(writerToManager, managerToReader, workFinished.out()));
  30.        
  31.         for (int i = 0; i < 3; i++){
  32.             parallel.addProcess(new WriterThread(i+1, writerToManager[i].out(), workFinished.in()));
  33.         }
  34.        
  35.         parallel.addProcess(new ReaderThread(4, managerToReader[0].in()));
  36.         parallel.addProcess(new ReaderThread(5, managerToReader[1].in()));
  37.          
  38.         parallel.run();
  39.     }
  40.  
  41.     /**
  42.      * @param args the command line arguments
  43.      */
  44.     public static void main(String[] args) {
  45.         new IlginisT_L3g().execute();
  46.     }
  47.    
  48.    
  49. class ControllerThread implements CSProcess{
  50.    
  51.     private static final String threadName = "procesas_VA";
  52.    
  53.     int n, m;
  54.     int changedCount;
  55.    
  56.     private One2OneChannel[] fromWriters;
  57.     private One2OneChannel[] toReaders;
  58.    
  59.     private SharedChannelOutput workFinishedOutput;
  60.    
  61.     private Guard[] guards;
  62.     private Alternative alt;
  63.    
  64.     public ControllerThread(One2OneChannel[] fromWriters, One2OneChannel[] toReaders, SharedChannelOutput workFinished){
  65.        
  66.         this.fromWriters = fromWriters;
  67.         this.toReaders = toReaders;
  68.         workFinishedOutput = workFinished;
  69.        
  70.         n = 0;
  71.         m = 100;
  72.        
  73.         guards = new Guard[3];
  74.        
  75.         for (int i = 0; i < 3; i++){
  76.             guards[i] = fromWriters[i].in();
  77.         }
  78.        
  79.         alt = new Alternative(guards);
  80.        
  81.         changedCount = 0;
  82.     }
  83.    
  84.     public void doTask(){
  85.         while (!workFinished()){
  86.             int guardInd = alt.fairSelect();
  87.  
  88.             if (fromWriters[guardInd].in().pending()){
  89.                 Object ob = fromWriters[guardInd].in().read();
  90.                 int data = (Integer) ob;
  91.                 n += data;
  92.                 m -= data;
  93.                
  94.                 // Patikrinimui kuris procesas atsiunte duomenis
  95.                 System.out.println("GAUTA: " + data + "      N = " + n + "      M = " + m);
  96.                
  97.                 changedCount++;
  98.                 if (changedCount >= 2){
  99.                     toReaders[0].out().write(new Number(n, m));
  100.                    
  101.                     toReaders[1].out().write(new Number(n, m));
  102.                     changedCount = 0;
  103.                 }
  104.                
  105.             }
  106.         }
  107.    
  108.     }
  109.    
  110.     public void sendDataToReaders(){
  111.        
  112.     }
  113.    
  114.     private boolean workFinished(){
  115.         if (Math.abs(n-m) <=5)
  116.             return true;
  117.         return false;
  118.     }
  119.    
  120.      public void notifyWriters(){
  121.         for (int i = 0; i < 3; i++)
  122.             workFinishedOutput.write(1);      
  123.     }
  124.      
  125.      public void notifyReaders(){
  126.         toReaders[0].out().write(new Number(-99, -99));
  127.         toReaders[1].out().write(new Number(-99, -99));
  128.      }
  129.    
  130.  
  131.     @Override
  132.     public void run() {
  133.         System.out.format("%-15s has started\n", threadName);
  134.        
  135.         doTask();
  136.         notifyWriters();
  137.         notifyReaders();
  138.        
  139.         System.out.format("%-15s has finished\n", threadName);
  140.     }
  141.      
  142. }
  143.  
  144. class WriterThread implements CSProcess{
  145.    
  146.     private int threadInd;
  147.     private String threadName = "Rasytojas_";
  148.    
  149.     private ChannelOutput output;  
  150.     private AltingChannelInput input;
  151.  
  152.     public WriterThread(int ind, ChannelOutput out, AltingChannelInput in){
  153.         threadInd = ind;
  154.         threadName += ind;
  155.        
  156.         output = out;
  157.         input = in;
  158.     }
  159.    
  160.  
  161.     public void sendDataToManager(){
  162.         boolean pending = false;
  163.        
  164.         while(!pending){                // Kai kanale Valdytojas -> Rasytojas atsiranda duomenys, reiskia darbas baigtas
  165.             output.write(threadInd);
  166.            
  167.             if (input.pending()){  
  168.                     pending = true;
  169.                     break;
  170.             }
  171.         }      
  172.     }
  173.  
  174.     @Override
  175.     public void run() {
  176.         System.out.format("%-15s has started\n", threadName);
  177.  
  178.         sendDataToManager();
  179.        
  180.         System.out.format("%-15s has finished\n", threadName);
  181.     }
  182.  
  183. }
  184.  
  185. class Number{
  186.     private int n, m;
  187.    
  188.     public Number(int first, int second){
  189.         n = first;
  190.         m = second;
  191.     }
  192.    
  193.     public int getN(){
  194.         return n;
  195.     }
  196.    
  197.     public int getM(){
  198.         return m;
  199.     }
  200.    
  201. }
  202.  
  203. class ReaderThread implements CSProcess{
  204.    
  205.     private int threadInd;
  206.     private String threadName = "Skaitytojas_";
  207.    
  208.     private AltingChannelInput input;
  209.  
  210.     public ReaderThread(int ind, AltingChannelInput in){
  211.        
  212.         threadInd = ind;
  213.         threadName += ind;
  214.        
  215.         input = in;
  216.     }
  217.    
  218.  
  219.     public void getDataFromManager(){
  220.         boolean workFinished = false;
  221.        
  222.         while (!workFinished){      // kol Valdytojas -> Skaitytojas kanalu negautas skaicius -99, darbas tebevyksta
  223.             if (input.pending()){
  224.                 Object ob = input.read();
  225.                 Number data = (Number) ob;
  226.                
  227.                 if (data.getN() == -99){
  228.                     workFinished = true;
  229.                 }else{  
  230.                     System.out.format("%-15s N = %5d     M = %5d \n", threadName, data.getN(), data.getM());
  231.                 }
  232.             }  
  233.         }
  234.        
  235.     }
  236.  
  237.     @Override
  238.     public void run() {
  239.         System.out.format("%-15s has started\n", threadName);
  240.  
  241.         getDataFromManager();
  242.        
  243.         System.out.format("%-15s has finished\n", threadName);
  244.     }
  245.  
  246. }
  247.  
  248.  
  249.    
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement