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