1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 /** 20 * @author Anatoly F. Bondarenko 21 */ 22 23 /** 24 * Created on 19.06.2006 25 */ 26 27 package org.apache.harmony.jpda.tests.jdwp.ThreadReference; 28 29 import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 30 import org.apache.harmony.jpda.tests.share.SyncDebuggee; 31 32 public class ThreadGroup002Debuggee extends SyncDebuggee { 33 public static final int THREAD_NUMBER_LIMIT = 6; 34 public static final String THREAD_NAME_PATTERN = "ThreadGroup002Debuggee_Thread_"; 35 public static final String THREAD_GROUP_NAME_PATTERN = "ThreadGroup002Debuggee_Thread_Group_"; 36 37 static ThreadGroup002Debuggee ThreadGroup002DebuggeeThis; 38 39 static volatile boolean allThreadsToFinish = false; 40 static int createdThreadsNumber = 0; 41 static volatile int startedThreadsNumber = 0; 42 43 static int firstThreadsNumber = 0; 44 45 static ThreadGroup002Debuggee_Thread[] ThreadGroup002DebuggeeThreads = null; 46 static ThreadGroup[] ThreadGroup002DebuggeeThreadGroups = new ThreadGroup[2]; 47 48 static Object waitTimeObject = new Object(); 49 static void waitMlsecsTime(long mlsecsTime) { 50 synchronized(waitTimeObject) { 51 try { 52 waitTimeObject.wait(mlsecsTime); 53 } catch (Throwable throwable) { 54 // ignore 55 } 56 } 57 } 58 59 static void sleepMlsecsTime(long mlsecsTime) { 60 try { 61 Thread.sleep(mlsecsTime); 62 } catch (Throwable throwable) { 63 // ignore 64 } 65 } 66 67 @Override 68 public void run() { 69 70 logWriter.println("--> ThreadGroup002Debuggee: START..."); 71 ThreadGroup002DebuggeeThis = this; 72 logWriter.println("--> ThreadGroup002Debuggee: Create thread groups..."); 73 ThreadGroup002DebuggeeThreadGroups[0] = 74 new ThreadGroup(THREAD_GROUP_NAME_PATTERN + 0); 75 ThreadGroup002DebuggeeThreadGroups[1] = 76 new ThreadGroup(THREAD_GROUP_NAME_PATTERN + 1); 77 78 logWriter.println("--> ThreadGroup002Debuggee: Create and start tested threads..."); 79 try { 80 ThreadGroup002DebuggeeThreads = new ThreadGroup002Debuggee_Thread[THREAD_NUMBER_LIMIT]; 81 for (int i=0; i < THREAD_NUMBER_LIMIT; i++) { 82 ThreadGroup002DebuggeeThreads[i] = 83 new ThreadGroup002Debuggee_Thread(ThreadGroup002DebuggeeThreadGroups[i%2], i); 84 ThreadGroup002DebuggeeThreads[i].start(); 85 createdThreadsNumber++; 86 } 87 } catch ( Throwable thrown) { 88 logWriter.println 89 ("--> ThreadGroup002Debuggee: Exception while creating threads: " + thrown); 90 } 91 logWriter.println 92 ("--> ThreadGroup002Debuggee: Created threads number = " + createdThreadsNumber); 93 94 while ( startedThreadsNumber != createdThreadsNumber ) { 95 waitMlsecsTime(100); 96 } 97 if ( createdThreadsNumber != 0 ) { 98 logWriter.println("--> ThreadGroup002Debuggee: All created threads are started!"); 99 } 100 101 synchronizer.sendMessage(Integer.toString(createdThreadsNumber)); 102 103 String mainThreadName = Thread.currentThread().getName(); 104 synchronizer.sendMessage(mainThreadName); 105 106 String mainThreadGroupName = Thread.currentThread().getThreadGroup().getName(); 107 synchronizer.sendMessage(mainThreadGroupName); 108 109 110 logWriter.println("--> ThreadGroup002Debuggee: Wait for signal from test to continue..."); 111 String messageFromTest = synchronizer.receiveMessage(); // signal to continue or to finish 112 113 if ( ! messageFromTest.equals("FINISH") ) { 114 logWriter.println 115 ("--> ThreadGroup002Debuggee: Send signal to the first threads to finish..."); 116 117 firstThreadsNumber = createdThreadsNumber/2; 118 for (int i=0; i < firstThreadsNumber; i++) { 119 while ( ThreadGroup002DebuggeeThreads[i].isAlive() ) { 120 waitMlsecsTime(10); 121 } 122 } 123 logWriter.println 124 ("--> ThreadGroup002Debuggee: First threads finished - number of finished threads = " + 125 firstThreadsNumber); 126 127 synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY); 128 129 logWriter.println("--> ThreadGroup002Debuggee: Wait for signal from test to finish..."); 130 synchronizer.receiveMessage(); // signal to finish 131 } 132 133 logWriter.println 134 ("--> ThreadGroup002Debuggee: Send signal to all threads to finish and wait..."); 135 allThreadsToFinish = true; 136 137 for (int i=0; i < createdThreadsNumber; i++) { 138 while ( ThreadGroup002DebuggeeThreads[i].isAlive() ) { 139 waitMlsecsTime(10); 140 } 141 } 142 logWriter.println 143 ("--> ThreadGroup002Debuggee: All threads finished!"); 144 145 logWriter.println("--> ThreadGroup002Debuggee: FINISH..."); 146 147 } 148 149 public static void main(String [] args) { 150 runDebuggee(ThreadGroup002Debuggee.class); 151 } 152 153 } 154 155 class ThreadGroup002Debuggee_Thread extends Thread { 156 157 int threadNumber; 158 int threadKind; 159 160 public ThreadGroup002Debuggee_Thread(ThreadGroup group, int threadNumber) { 161 super(group, ThreadGroup002Debuggee.THREAD_NAME_PATTERN + threadNumber); 162 this.threadNumber = threadNumber; 163 threadKind = threadNumber % 3; 164 } 165 166 @Override 167 public void run() { 168 ThreadGroup002Debuggee parent = ThreadGroup002Debuggee.ThreadGroup002DebuggeeThis; 169 synchronized (parent) { 170 ThreadGroup002Debuggee.startedThreadsNumber++; 171 } 172 while ( ! ThreadGroup002Debuggee.allThreadsToFinish ) { 173 switch ( threadKind ) { 174 case 0: 175 ThreadGroup002Debuggee.waitMlsecsTime(100); 176 break; 177 case 1: 178 ThreadGroup002Debuggee.sleepMlsecsTime(100); 179 } 180 if (threadNumber < ThreadGroup002Debuggee.firstThreadsNumber ) { 181 return; 182 } 183 } 184 } 185 } 186 187 188