• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 public class Main {
main(String[] args)18     public static void main(String[] args) {
19         checkExceptions();
20         checkTiming();
21     }
22 
sleep(int msec)23     public static void sleep(int msec) {
24         try {
25             Thread.sleep(msec);
26         } catch (InterruptedException ie) {
27             System.err.println("sleep interrupted");
28         }
29     }
30 
checkExceptions()31     static void checkExceptions() {
32         try {
33             System.out.println(PartialInit.FIELD0);
34             System.err.println("Construction of PartialInit succeeded unexpectedly");
35         } catch (ExceptionInInitializerError eiie) {
36             System.out.println("Got expected EIIE for FIELD0");
37         }
38 
39         try {
40             System.out.println(PartialInit.FIELD0);
41             System.err.println("Load of FIELD0 succeeded unexpectedly");
42         } catch (NoClassDefFoundError ncdfe) {
43             System.out.println("Got expected NCDFE for FIELD0");
44         }
45         try {
46             System.out.println(PartialInit.FIELD1);
47             System.err.println("Load of FIELD1 succeeded unexpectedly");
48         } catch (NoClassDefFoundError ncdfe) {
49             System.out.println("Got expected NCDFE for FIELD1");
50         }
51     }
52 
checkTiming()53     static void checkTiming() {
54         FieldThread fieldThread = new FieldThread();
55         MethodThread methodThread = new MethodThread();
56 
57         fieldThread.start();
58         methodThread.start();
59 
60         /* start class init */
61         IntHolder zero = SlowInit.FIELD0;
62 
63         /* wait for children to complete */
64         try {
65             fieldThread.join();
66             methodThread.join();
67         } catch (InterruptedException ie) {
68             System.err.println(ie);
69         }
70 
71         /* print all values */
72         System.out.println("Fields (main thread): " +
73             SlowInit.FIELD0.getValue() + SlowInit.FIELD1.getValue() +
74             SlowInit.FIELD2.getValue() + SlowInit.FIELD3.getValue());
75     }
76 
77     static class FieldThread extends Thread {
run()78         public void run() {
79             /* allow SlowInit's <clinit> to start */
80             Main.sleep(1000);
81 
82             /* collect fields; should delay until class init completes */
83             int field0, field1, field2, field3;
84             field0 = SlowInit.FIELD0.getValue();
85             field1 = SlowInit.FIELD1.getValue();
86             field2 = SlowInit.FIELD2.getValue();
87             field3 = SlowInit.FIELD3.getValue();
88 
89             /* let MethodThread print first */
90             Main.sleep(5000);
91             System.out.println("Fields (child thread): " +
92                 field0 + field1 + field2 + field3);
93         }
94     }
95 
96     static class MethodThread extends Thread {
run()97         public void run() {
98             /* allow SlowInit's <clinit> to start */
99             Main.sleep(1000);
100 
101             /* use a method that shouldn't be accessible yet */
102             SlowInit.printMsg("MethodThread message");
103         }
104     }
105 }
106