1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/*******************************************************************************
* Copyright (c) 2022 Microsoft Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Microsoft Corporation - initial API and implementation
*******************************************************************************/
import java.io.OutputStream;
import java.io.PrintWriter;
public class TryVirtualThread implements Runnable {
/**
* A <code>Thread</code> object
*/
public static Thread fThread;
/**
* A <code>Thread</code> object representing the main thread
*/
public static Thread fMainThread;
public static Thread fVirtualThread;
/**
* The instance of the <code>MainClass</code>
*/
public static TryVirtualThread fObject = new TryVirtualThread();
/**
* An integer value
*/
public static int fInt = 0;
/**
* A string initialized to 'hello world'
*/
public static String fString = "Hello World";
/**
* The name of an event type
*/
public static String fEventType = "";
/**
* Runs the test program
* @param args
*/
public static void main(java.lang.String[] args) {
// Ensure at least one carrier thread is created.
fVirtualThread = Thread.startVirtualThread(() -> {
System.out.println("Start a test virtual thread.");
});
ThreadGroup group = new ThreadGroup("Test ThreadGroup");
fThread = new Thread(group, fObject, "Test Thread");
fThread.start();
fMainThread = Thread.currentThread();
// Prevent this thread from dying
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
@Override
public void run() {
try {
while (true) {
printAndSignal();
triggerEvent();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
} finally {
System.out.println("Running finally block in MainClass.run()");
}
}
/**
* Prints to System.out and throws an exception to indicate readiness
*/
synchronized public void printAndSignal() {
print(System.out);
// Signal readiness by throwing an exception
try {
throw new NegativeArraySizeException();
} catch (NegativeArraySizeException exc) {
}
}
public void print(OutputStream out) {
String string = fInt++ +". " + fString;
PrintWriter writer = new PrintWriter(out);
writer.println(string);
writer.flush();
}
/**
* Trigger an event for the front-end.
*/
private void triggerEvent() {
/* Ensure we do it only once */
String eventType = fEventType;
fEventType = "";
/* Trigger event according to the field fEventType */
if (eventType.isEmpty()) {
return;
} else if (eventType.equals("ThreadStartEvent")) {
triggerThreadStartEvent();
} else if (eventType.equals("ThreadDeathEvent")) {
triggerThreadDeathEvent();
} else {
System.out.println("Unknown event type: " + eventType);
}
}
/**
* Trigger a thread end event for the front-end.
*/
private void triggerThreadDeathEvent() {
Thread.startVirtualThread(() -> {
System.out.println("Test VirtualThread Death Event");
});
}
/**
* Trigger a thread start event for the front-end.
*/
private void triggerThreadStartEvent() {
Thread.startVirtualThread(() -> {
System.out.println("Test VirtualThread Start Event");
});
}
}
|