summaryrefslogtreecommitdiff
path: root/java/tests/Concurrency/SemaphoreTest.java
blob: 489f2cb0307b9ad4cc4a06d0b80880227ab57379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*************************************************
 *
 * = PACKAGE
 *    tests.Concurrency
 *
 * = FILENAME
 *    SemaphoreTest.java
 *
 *@author Prashant Jain
 *
 *************************************************/
package tests.Concurrency;

import java.io.*;
import ACE.OS.*;
import ACE.Concurrency.*;

class SemaphoreWriter extends Thread
{
  SemaphoreWriter (int nIterations, Semaphore s)
    {
      this.nIterations_ = nIterations;
      this.s_ = s;
    }

  public void run ()
    {
      for (int i = 1; i <= this.nIterations_; i++)
	{
	  // Acquire the semaphore (will block until it gets it)
	  try
	    {
	      this.s_.acquire ();
	    }
	  catch (InterruptedException e)
	    {
	      ACE.ERROR (e);
	    }
	  
	  SemaphoreTest.counter++;
	  ACE.DEBUG (Thread.currentThread ().toString () +
		     " acquired semaphore in iteration " + i +
		     ", counter = " + SemaphoreTest.counter);
	  
	  try
	    {
	      Thread.sleep (1);
	    }
	  catch (InterruptedException e)
	    {
	    }

	  // Release the semaphore
	  this.s_.release ();
	  ACE.DEBUG (Thread.currentThread ().toString () +
		     " released semaphore in iteration " + i);
	  try
	    {
	      Thread.sleep (1);
	    }
	  catch (InterruptedException e)
	    {
	    }

	}
    }
  
  int nIterations_;
  Semaphore s_;
}

public class SemaphoreTest
{
  public static void main (String args[])
    {
      int nThreads = 1;
      int count = 1;
      int nIterations = 100;
      int i;
      try
	{
	  if (args.length == 3)
	    {
	      nThreads = Integer.parseInt (args[0]);
	      count = Integer.parseInt (args[1]);
	      nIterations = Integer.parseInt (args[2]);
	    }
	}
      catch (NumberFormatException e)
	{
	  ACE.ERROR ("Illegal argument.");
	}

      // Create a lock
      Semaphore s = new Semaphore (count);

      // Spawn off n_threads
      for (i = 0; i < nThreads; i++)
	new SemaphoreWriter (nIterations, s).start ();            
    }
  public static int counter;
}