1 /* 2 * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 package gc.gctests.ObjectMonitorCleanup; 24 25 import nsk.share.test.ExecutionController; 26 27 /** 28 * Helper thread class for ObjectMonitorCleanup class 29 */ 30 public class MonitorThread extends Thread { 31 32 /** 33 * Object used for synchronization between threads in the test. 34 */ 35 public static volatile Object otherObject; 36 /** 37 * Simple way for the test to check if the running thread completed 38 * it's work or not. 39 */ 40 public boolean completedOk; 41 /** 42 * Tells the worker thread if it should keep running or if 43 * it should terminate. 44 */ 45 public volatile boolean keepRunning; 46 private ExecutionController stresser; 47 48 /** 49 * Constructor for the thread. 50 * 51 * @param maxRunTimeMillis Maximum time in milliseconds that 52 * the thread should run. 53 */ 54 public MonitorThread(ExecutionController stresser) { 55 this.stresser = stresser; 56 this.otherObject = new Object(); /* avoid null on first reference */ 57 } 58 59 /** 60 * Main entry point for the thread. 61 */ 62 public final void run() { 63 synchronized (this) { 64 completedOk = false; 65 keepRunning = true; 66 } 67 68 // Do we need to lock keepRunning before we check it? 69 while (keepRunning 70 && stresser.continueExecution()) { 71 Object placeholder = otherObject; 72 synchronized (placeholder) { 73 placeholder.notifyAll(); 74 } 75 } 76 77 synchronized (this) { 78 completedOk = keepRunning; 79 } 80 } 81 }