In: Computer Science
Using Eclipse to answer this Java question
Using the concepts from the Concurrency Basics Tutorial I provided in Modules, write a program that consists of two threads. The first is the main thread that every Java application has. The main thread should create a new thread from the Runnable object, MessageLoop, and wait for it to finish. If the MessageLoop thread takes too long to finish, the main thread should interrupt it. Use a variable named maxWaitTime to store the maximum number of seconds to wait. The main thread should output a message stating that it is still waiting every half second.
The MessageLoop thread should print out a series of 5 messages. It should wait 850 milliseconds between printing messages to create a delay. If it is interrupted before it has printed all its messages, the MessageLoop thread should print "Message loop interrupted" and exit.
Your program must demonstrate that it can both output messages and interrupt the message output. To do this, place your code in main into a for loop using maxWaitTime as the index.
So in main your code will be
for (int maxWaitTime = 1; maxWaitTime <= 5; maxWaitTime++) {
// All of main's processing goes here (All does not mean part of. ALL of main).
}
maxWaitTime means the same as it would in real life. It is how long the main thread waits before interrupting. Think about this. Don't confuse milliseconds and seconds.
Sample output :
maxWaitTime: 1 second(s)
main : Starting MessageLoop thread
main : Waiting for MessageLoop thread to finish
main : Continuing to wait...
main : Continuing to wait...
Thread-0 : 1. All that is gold does not glitter, Not all those who
wander are lost
main : MessageLoop interrupted
maxWaitTime: 2 second(s)
main : Starting MessageLoop thread
main : Waiting for MessageLoop thread to finish
main : Continuing to wait...
main : Continuing to wait...
Thread-1 : 1. All that is gold does not glitter, Not all those who
wander are lost
main : Continuing to wait...
main : Continuing to wait...
Thread-1 : 2. The old that is strong does not wither, Deep roots
are not reached by the frost
main : MessageLoop interrupted
maxWaitTime: 3 second(s)
main : Starting MessageLoop thread
main : Waiting for MessageLoop thread to finish
main : Continuing to wait...
main : Continuing to wait...
Thread-2 : 1. All that is gold does not glitter, Not all those who
wander are lost
main : Continuing to wait...
main : Continuing to wait...
Thread-2 : 2. The old that is strong does not wither, Deep roots
are not reached by the frost
main : Continuing to wait...
main : Continuing to wait...
Thread-2 : 3. From the ashes a fire shall be woken, A light from
the shadows shall spring
main : MessageLoop interrupted
maxWaitTime: 4 second(s)
main : Starting MessageLoop thread
main : Waiting for MessageLoop thread to finish
main : Continuing to wait...
main : Continuing to wait...
Thread-3 : 1. All that is gold does not glitter, Not all those who
wander are lost
main : Continuing to wait...
main : Continuing to wait...
Thread-3 : 2. The old that is strong does not wither, Deep roots
are not reached by the frost
main : Continuing to wait...
main : Continuing to wait...
Thread-3 : 3. From the ashes a fire shall be woken, A light from
the shadows shall spring
main : Continuing to wait...
Thread-3 : 4. Renewed shall be blade that was broken
main : Continuing to wait...
main : MessageLoop interrupted
maxWaitTime: 5 second(s)
main : Starting MessageLoop thread
main : Waiting for MessageLoop thread to finish
main : Continuing to wait...
main : Continuing to wait...
Thread-4 : 1. All that is gold does not glitter, Not all those who
wander are lost
main : Continuing to wait...
main : Continuing to wait...
Thread-4 : 2. The old that is strong does not wither, Deep roots
are not reached by the frost
main : Continuing to wait...
main : Continuing to wait...
Thread-4 : 3. From the ashes a fire shall be woken, A light from
the shadows shall spring
main : Continuing to wait...
Thread-4 : 4. Renewed shall be blade that was broken
main : Continuing to wait...
main : Continuing to wait...
Thread-4 : 5. The crownless again shall be king
main : Done!
Multithreading is a Java feature that allows concurrent execution of two or more parts of a program for maximum utilization of CPU. But it should be noted that at any instance only thread can run.
Threads can be created by using two mechanisms extending the Thread class and Implementing the Runnable Interface.
The program for the above demonstration starts below,
package mythreadpackage;
public class MyThreads {
// Display a message, the name of the current
thread
static void threadMessage(String message)
{
String threadName
=
Thread.currentThread().getName();
System.out.format("%s:
%s%n",
threadName,
message);
}
private static class MessageLoop
implements Runnable
{
public void run()
{
String importantInfo[] = {
"1.All that is gold does not glitter, Not all those who wander are
lost",
"2.The old that is strong does not wither, Deep roots are not
reached by the frost",
"3.From the ashes a fire shall be woken, A light from the shadows
shall spring",
"4.Renewed shall be blade that was broken",
"5.The crownless again shall be king"
};
try {
for (int i = 0;
i < importantInfo.length;
i++) {
Thread.sleep(850);
// Print a message
threadMessage(importantInfo[i]);
}
} catch (InterruptedException e) {
threadMessage("MessageLoop interrupted");
}
}
}
public static void main(String args[])
throws
InterruptedException {
// To change
themaxWaitTime
for (int maxWaitTime = 1;
maxWaitTime <= 5; maxWaitTime++) {
System.out.println("maxWaitTime: "+maxWaitTime+" seconds");
threadMessage("Starting MessageLoop thread");
long
startTime = System.currentTimeMillis();
Thread t = new Thread(new MessageLoop());
t.start();
threadMessage("Waiting for MessageLoop thread to finish");
//
loop until MessageLoop
//
thread exits
while
(t.isAlive()) {
Thread.sleep(500);
threadMessage("Continuing to wait...");
if (((System.currentTimeMillis() - startTime) >
maxWaitTime*1000)
&& t.isAlive()) {
threadMessage("MessageLoop interrupted");
t.interrupt();
// -- wait indefinitely
t.join();
}
}
threadMessage("Done!");
}
}
}
Please find attached the screenprint of the program and output,