Java Threads Interview Questions – 1
1)What is threaded programming and when is it used?
Threaded programming is normally used when a program is required to do more than one task at the same time. Threading is often used in applications with graphical user interfaces; a new thread may be created to do some processor-intensive work while the main thread keeps the interface responsive to human interaction.
The Java programming language has threaded programming facilities built in, so it is relatively easy to create threaded programs. However, multi-threaded programs introduce a degree of complexity that is not justified for most simple command line applications.
A: These methods are detailed on the Java Software Development Kit JavaDoc page for the
Object class, they are to implement threaded programming for all subclasses of
A: The static
Thread.sleep(long) method maintains control of thread execution but delays the next action until the sleep time expires. The
wait method gives up control over thread execution indefinitely so that other threads can run.
A: A Java
Thread controls the main path of execution in an application. When you invoke the Java Virtual Machine with the
java command, it creates an implicit thread in which to execute the
main method. The
Thread class provides a mechanism for the first thread to start-up other threads to run in parallel with it.
Runnable interface defines a type of class that can be run by a thread. The only method it requires is
run, which makes the interface very easy to to fulfil by extending existing classes. A runnable class may have custom constructors and any number of other methods for configuration and manipulation.
A: It may help to think of the
run method like the
main method in standard single threaded applications. The
run method is a standard entry point to run or execute a class. The
run method is normally only executed in the context of an independent
Thread, but is a normal method in all other respects.
run method normally invokes the
run method of the
Runnable type it is passed in its constructor. However, it is possible to override the thread’s
run method with your own.
A: There is little difference in the work required to override the
Thread class compared with implementing the
Runnable interface, both require the body of the
run() method. However, it is much simpler to make an existing class hierarchy runnable because any class can be adapted to implement the
run() method. A subclass of
Thread cannot extend any other type, so application-specific code would have to be added to it rather than inherited.
Thread class from the
Runnable implementation also avoids potential synchronization problems between the thread and the
run() method. A separate
Runnable generally gives greater flexibility in the way that runnable code is referenced and executed.
A: The separate
run() methods in the
Thread class provide two ways to create threaded programs. The
start() method starts the execution of the new thread and calls the
run() method. The
start() method returns immediately and the new thread normally continues until the
run() method returns.
run() method does nothing, so sub-classes should override the method with code to execute in the second thread. If a
Thread is instantiated with a
Runnable argument, the thread’s
run() method executes the
run() method of the
Runnable object in the new thread instead.
Depending on the nature of your threaded program, calling the
run() method directly can give the same output as calling via the
start() method, but in the latter case the code is actually executed in a new thread.
start() method is not marked
final, but should not be overridden. This method contains the code that creates a new executable thread and is very specialised. Your threaded application should either pass a
Runnable type to a new
Thread, or extend
Thread and override the
A: It depends whether the method affects method local variables, class static or instance variables. If only method local variables are changed, the value is said to be confined by the method and is not prone to threading issues.
A: To introduce a
Runnable type to an existing class hierarchy, you need to create a sub-class that declares that it implements the
Runnable interface, and provide a
run method to fullfil the interface. This combination of interface and inheritance means that runnable implementations can be very minor extensions of existing classes, as in the example below…
A: The static utility method
invokeLater(Runnable) is intended to execute a new runnable thread from a Swing application without disturbing the normal sequence of event dispatching from the Graphical User Interface (GUI). The method places the runnable object in the queue of Abstract Windowing Toolkit (AWT) events that are due to be processed and returns immediately. The runnable object’s
run() method is only called when it reaches the front of the queue.
The deferred effect of the
invokeLater(Runnable) method ensures that any necessary updates to the user interface can occur immediately, and the runnable work will begin as soon as those high priority events are dealt with. The invoke later method might be used to start work in response to a button click that also requires a significant change to the user interface, perhaps to restrict other activities, while the runnable thread executes.
volatile modifier is used to identify variables whose values should not be optimized by the Java Virtual Machine, by caching the value for example. The
volatile modifier is typically used for variables that may be accessed or modified by numerous independent threads and signifies that the value may change without synchronization.
wait() method is defined in the
Object class, which is the ultimate superclass of all others. So the
Thread class and any
Runnable implementation inherit this method from
wait() method is normally called on an object in a multi-threaded program to allow other threads to run. The method should should only be called by a thread that has ownership of the object’s monitor, which usually means it is in a
synchronized method or statement block.
A: A green thread refers to a mode of operation for the Java Virtual Machine (JVM) in which all code is executed in a single operating system thread. If the Java program has any concurrent threads, the JVM manages multi-threading internally rather than using other operating system threads.
There is a significant processing overhead for the JVM to keep track of thread states and swap between them, so green thread mode has been deprecated and removed from more recent Java implementations. Current JVM implementations make more efficient use of native operating system threads.
A: A working thread, more commonly known as a worker thread is the key part of a design pattern that allocates one thread to execute one task. When the task is complete, the thread may return to a thread pool for later use. In this scheme a thread may execute arbitrary tasks, which are passed in the form of a
Runnable method argument, typically
execute(Runnable). The runnable tasks are usually stored in a queue until a thread host is available to run them.
The worker thread design pattern is usually used to handle many concurrent tasks where it is not important which finishes first and no single task needs to be coordinated with another. The task queue controls how many threads run concurrently to improve the overall performance of the system. However, a worker thread framework requires relatively complex programming to set up, so should not be used where simpler threading techniques can achieve similar results.