ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadLocalTest.java
Revision: 1.6
Committed: Fri Jul 31 23:37:31 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +3 -4 lines
Log Message:
whitespace

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.4 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4     * http://creativecommons.org/licenses/publicdomain
5     * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9     import junit.framework.*;
10     import java.util.concurrent.Semaphore;
11    
12 dl 1.2 public class ThreadLocalTest extends JSR166TestCase {
13 dl 1.1 public static void main(String[] args) {
14     junit.textui.TestRunner.run(suite());
15     }
16    
17     public static Test suite() {
18     return new TestSuite(ThreadLocalTest.class);
19     }
20    
21 dl 1.5 static ThreadLocal<Integer> tl = new ThreadLocal<Integer>() {
22     public Integer initialValue() {
23     return one;
24     }
25     };
26    
27     static InheritableThreadLocal<Integer> itl =
28     new InheritableThreadLocal<Integer>() {
29     protected Integer initialValue() {
30     return zero;
31     }
32    
33     protected Integer childValue(Integer parentValue) {
34     return new Integer(parentValue.intValue() + 1);
35 dl 1.1 }
36     };
37    
38 dl 1.3 /**
39     * remove causes next access to return initial value
40     */
41 dl 1.1 public void testRemove() {
42     assertEquals(tl.get(), one);
43     tl.set(two);
44     assertEquals(tl.get(), two);
45     tl.remove();
46     assertEquals(tl.get(), one);
47 dl 1.5 }
48    
49     /**
50     * remove in InheritableThreadLocal causes next access to return
51     * initial value
52     */
53     public void testRemoveITL() {
54     assertEquals(itl.get(), zero);
55     itl.set(two);
56     assertEquals(itl.get(), two);
57     itl.remove();
58     assertEquals(itl.get(), zero);
59     }
60    
61     private class ITLThread extends Thread {
62     final int[] x;
63     ITLThread(int[] array) { x = array; }
64     public void run() {
65     Thread child = null;
66     if (itl.get().intValue() < x.length - 1) {
67     child = new ITLThread(x);
68     child.start();
69     }
70     Thread.currentThread().yield();
71    
72     int threadId = itl.get().intValue();
73     for (int j = 0; j < threadId; j++) {
74     x[threadId]++;
75     Thread.currentThread().yield();
76     }
77    
78     if (child != null) { // Wait for child (if any)
79     try {
80     child.join();
81 jsr166 1.6 } catch (InterruptedException e) {
82 dl 1.5 threadUnexpectedException();
83     }
84     }
85     }
86     }
87    
88     /**
89     * InheritableThreadLocal propagates generic values.
90     */
91     public void testGenericITL() {
92     final int threadCount = 10;
93     final int x[] = new int[threadCount];
94     Thread progenitor = new ITLThread(x);
95     try {
96     progenitor.start();
97     progenitor.join();
98 jsr166 1.6 for (int i = 0; i < threadCount; i++) {
99 dl 1.5 assertEquals(i, x[i]);
100     }
101 jsr166 1.6 } catch (InterruptedException e) {
102 dl 1.5 unexpectedException();
103     }
104 dl 1.1 }
105     }