aboutsummaryrefslogtreecommitdiff
path: root/libjava/testsuite/libjava.lang/Thread_Wait_Interrupt.java
blob: be7b5551614191fc9d8ee823904a83aaa20baf5b (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
// Create two threads waiting on a monitor. Interrupt one of them. Does the 
// other wake up correctly?
// Origin: Bryce McKinlay <bryce@albatross.co.nz>

class Waiter extends Thread
{
  Object monitor;
  int thread_num;
  boolean interrupted = false;
  boolean notified = false; 

  Waiter (Object monitor, int thread_num)
  {
    this.monitor = monitor;
    this.thread_num = thread_num;
  }
  
  public void run()
  {
    synchronized (monitor)
      {
        System.out.println ("Thread waiting.");
	try
	{
	  long start = System.currentTimeMillis();
	  monitor.wait(1000);
	  long time = System.currentTimeMillis() - start;
	  if (time > 990)
	    System.out.println ("Error: wait on thread " + thread_num 
	                        + " timed out.");
	  else
	    notified = true;
	}
	catch (InterruptedException x)
	{
	  interrupted = true;
	}
      }
    
  }
}

public class Thread_Wait_Interrupt
{
  public static void main(String args[])
  {
    Object monitor = new Object();
    Waiter w1 = new Waiter(monitor, 1);
    Waiter w2 = new Waiter(monitor, 2);
    w1.start();
    w2.start();
    try
    {
      Thread.sleep(250);

      synchronized (monitor)
      {
	w1.interrupt();
	monitor.notify();
      }

      w1.join();
      w2.join();
      System.out.println("join ok");
      System.out.println("Thread 1 " + 
                         (w1.interrupted ? "interrupted ok" : "error"));
      System.out.println("Thread 2 " +
                         (w2.notified ? "notified ok" : "error"));

    }
    catch (InterruptedException x)
    {
      System.out.println (x);
    }
  }
}