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 17public class Main { 18 public static void main(String[] args) { 19 checkExceptions(); 20 checkTiming(); 21 } 22 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 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 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 { 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 { 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