/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.util.ArrayList;

/**
 * Test some basic thread stuff.
 */
public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("Initializing System.out...");

        MyThread[] threads = new MyThread[512];
        for (int i = 0; i < 512; i++) {
            threads[i] = new MyThread();
        }

        for (MyThread thread : threads) {
            thread.start();
        }
        for (MyThread thread : threads) {
            thread.join();
        }

        System.out.println("Thread count: " + MyThread.mCount);

        go();
        System.out.println("thread test done");
    }

    public static void go() {
        Thread t = new Thread(null, new ThreadTestSub(), "Thready", 7168);

        t.setDaemon(false);

        System.out.print("Starting thread '" + t.getName() + "'\n");
        t.start();

        try {
            t.join();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        System.out.print("Thread starter returning\n");
    }

    /*
     * Simple thread capacity test.
     */
    static class MyThread extends Thread {
        static int mCount = 0;
        public void run() {
            synchronized (MyThread.class) {
                ++mCount;
            }
            try {
                sleep(1000);
            } catch (Exception ex) {
            }
        }
    }
}

class ThreadTestSub implements Runnable {
    public void run() {
        System.out.print("@ Thread running\n");

        try {
            Thread.currentThread().setDaemon(true);
            System.out.print("@ FAILED: setDaemon() succeeded\n");
        } catch (IllegalThreadStateException itse) {
            System.out.print("@ Got expected setDaemon exception\n");
        }

        //if (true)
        //    throw new NullPointerException();
        try {
            Thread.sleep(2000);
        }
        catch (InterruptedException ie) {
            System.out.print("@ Interrupted!\n");
        }
        finally {
            System.out.print("@ Thread bailing\n");
        }
    }
}
