/*
 * Example from Script 3.4. Exercise 5
 *
 * s = sum_i=1..m a[i] in 3 concurent tasks
 * con
 *     S(1), S(2), S(3)
 * end
 * println "s=", s;
 */
/* output:

   java ex5 0

   l = 0, b = 0, e = 1000
   l = 1, b = 1000, e = 2000
   l = 12, b = 12000, e = 13000
   l = 13, b = 13000, e = 14000
   l = 14, b = 14000, e = 15000
   l = 15, b = 15000, e = 16000
   l = 16, b = 16000, e = 17000
   l = 17, b = 17000, e = 18000
   l = 18, b = 18000, e = 19000
   l = 19, b = 19000, e = 20000
   l = 4, b = 4000, e = 5000
   l = 5, b = 5000, e = 6000
   l = 6, b = 6000, e = 7000
   l = 7, b = 7000, e = 8000
   l = 8, b = 8000, e = 9000
   l = 9, b = 9000, e = 10000
   l = 10, b = 10000, e = 11000
   l = 11, b = 11000, e = 12000
   l = 2, b = 2000, e = 3000
   l = 3, b = 3000, e = 4000
   l = 0
   l = 1
   l = 4
   l = 12
   l = 13
   l = 14
   l = 15
   l = 16
   l = 17
   l = 18
   l = 19
   l = 5
   l = 6
   l = 7
   l = 8
   l = 9
   l = 10
   l = 11
   l = 2
   l = 3
   results
   s = 199990000, x = 199990000

oder
   java ex5

   l = 0, b = 0, e = 285
   l = 1, b = 285, e = 570
   l = 2, b = 570, e = 855
   l = 3, b = 855, e = 1140
   l = 4, b = 1140, e = 1425
   l = 5, b = 1425, e = 1710
   l = 6, b = 1710, e = 2000
   l = 4
   l = 6
   l = 5
   l = 0
   l = 1
   l = 3
   l = 2
   results
   s = 1999000, x = 1999000

*/

class ex5act1 implements Runnable {

  int l, b, e;

  public ex5act1(int li, int bi, int ei) {
    l = li; b = bi; e = ei; 
  }

  public void run() {

    System.out.println("l = " + l + ", b = " + b + ", e = " + e);
    ex5.probe();

    /* local var */
    long s = 0;

    /* do the work */
    for (int i = b; i<e; i++) { s += ex5.a[i]; };

    /* globalize it */
    synchronized (ex5.gsum) { ex5.s += s; }

    System.out.println("l = " + l);
  
  }
}


public class ex5 {
  
  /*parameters */
  public static final int m = 20000, t = 20;

  /* work vars */
  public static long s, x, a[];

  /* sync access to global variable */ 
  public static Object gsum = new Object();

  public static int p = 100; 
 
  public static void main(String[] args) throws InterruptedException {

    if (args.length == 1) { 
       try { p = Integer.parseInt(args[0]); } 
       catch (NumberFormatException e) { } 
    } 

    s = 0; x = 0; 

    /* initial data */
    a = new long[m];
    for (int i = 0; i<m; i++) { a[i]=i; x+=i; }

    /* work assignments */
    int b, e;

    /* con statement */
    Thread th[] = new Thread[t]; 
    for (int i = 0; i<t; i++) { 
        b = (m/t)*i; e = (m/t)*(i+1); if (i == t-1) { e = m; } 
        th[i] = new Thread(new ex5act1(i,b,e));
        th[i].start();
    }
    for (int i = 0; i<t; i++) { th[i].join(); }

    System.out.println("results ");
    System.out.println("s = " + s + ", x = " + x);

  }
 
  public static void probe() { 
    Sleep.sleep(p);
  }

}




