Module 4 Final
Module 4 Final
PACKAGES
Package
Definition: A java package is defined as a group of similar types of classes, interfaces
and sub-packages.
Packages in java is a mechanism to encapsulate a group of classes, interfaces and sub
packages.
Advantages of Java Package
1. Java package is used to categorize the classes and interfaces so that they can be
easily located and maintained.
2. Java package provides access protection.
3. Java package removes naming collision.
4. Reusability: Reusability of code is one of the most important requirements in
the software industry. Reusability saves time, effort and also ensures
consistency. A class once developed can be reused by any number of programs
wishing to incorporate the class in that particular program.
Types of packages
Packages in java can be categorized in two forms:
1. Built-in packages
2. User-Defined packages.
1. Built-in packages: These are predefined packages in java library. There are many
built-in packages such as java, lang, awt, javax, swing, net, io, util, sql etc. Following
figure shows some built-in packages.
Page 1
Packages & Multithreading
Page 2
Packages & Multithreading
Syntax:
import [Link];
Ex:
import college. Library;
//filename: [Link]
package pack1; //creating pack1 package
Compile:
javac –d . [Link]
It creates [Link] file in the package(directory) pack1 in the current
directory.
Suppose if we want to add one more class ThankingCode to the same package pack1.
//filename: [Link]
package pack1; //adding one more class to pack1 package
public class ThankingCode
{
public static void thank()
{
[Link]("Bye guys..... All The Best.... ");
}
}
Compile:
javac –d . [Link]
It creates [Link] file in the package (directory) pack1 in the current
directory.
Page 3
Packages & Multithreading
Now import the above package pack1 to another program [Link] and call
greet() and thank() .
//filename: [Link]
class PartyCode
{
public static void main(String args[])
{
[Link]();
[Link](“A great evening to all of you, enjoy the party.......”);
[Link]();
}
}
Compile:
D:\javaprograms> javac [Link]
D:\javaprograms> java PartyCode
Output:
Hello guys....... welcome
A great evening to all of you, enjoy the party........
Bye guys..... All The Best....
Note: 1 It is easy to organize class files into packages. All we need to do is put related
class files in the same directory, give the directory a name that relates to the
purpose of the classes, and add a line to the top of each class file that declares
the package name, which is the same as the directory name where they reside.
Note:2 To import all items in a package, no need to refer them individually but we can
import them collectively by using the asterisk * is a wild character of Windows
which means all the files (means all the classes).
Page 4
Packages & Multithreading
Nesting Packages
Package inside the package is called the subpackage. This process is called nesting
packages.
It means we can also create any no. of packages inside another package.
To nest one package inside another package, use the following syntax:
package package1.package2.package3.................... ;
//filename: [Link]
package nestedpackage; //creating nestedpackage
public class PackCode1
{
int a;
int b;
public PackCode1(int x, int y)
{
a=x;
b=y;
}
public void add()
{
[Link](a+ "+" +b+ "=" +(a+b));
}
}
//filename: [Link]
package nestedpackage.pack2; //
public class PackCode2
{
int a;
int b;
public PackCode2(int x, int y)
{
Page 5
Packages & Multithreading
a=x;
b=y;
}
public void multiply()
{
[Link](a+ "x" +b+ "=" +(a*b));
}
}
Output:
Enter any two numbers:
25
25
Sum and Product of your two numbers is:
25+25=50
25x25=625
Page 6
Packages & Multithreading
Built-in Packages
Java is rich of built-in packages. The following is the list of built-in packages.
PACKAGE
EXAMPLE CLASSES FUNCTIONALITY (PURPOSE)
NAME
These classes are indispensable
for every Java program. For this
System, String, Object, Thread,
[Link] reason, even if this package is not
Exception etc.
imported, JVM automatically
imports.
These are called as utility
[Link] (service) classes and are used
very frequently in coding.
FileInputStream,
FileOutputStream, FileReader, These classes are used in all I/O
[Link] FileWriter, RandomAccessFile, operations including keyboard
BufferedReader, BufferedWriter input.
etc.
URL, ServerSocket, Socket, Useful for writing socket
[Link] DatagramPacket, programming (LAN
DatagramSocket etc. communication).
Required for developing applets
AppletContext, Applet,
[Link] that participate on client-side in
AudioStub, AudioClip etc
Internet (Web) programming.
Button, Choice, TextField, Essential for developing GUI
[Link]
Frame, List, Checkbox etc. applications.
MouseListener, ActionListener, Without these classes, it is
java. awt.
ActionEvent, WindowAdapter impossible to handle events
event
etc. generated by GUI components
DriverManager, Statement, Required for database access in
[Link]
Connection, ResultSet etc JDBC applications.
Page 7
Packages & Multithreading
Multi threading:
It is the process of implementing two or more parts of a program to run
concurrently. Each part of such a program is called a thread, and each thread defines a
separate path of execution, thus multithreading is a specialized form of multitasking.
Process-based Multitasking(Multiprocessing)
Thread-based Multitasking(Multithreading)
Process-based Multitasking
Each process has its own address in memory i.e. each process allocates separate
memory area.
Process is heavyweight.
Cost of communication between the process is high.
Switching from one process to another require some time for saving and loading
registers, memory maps, updating lists etc.
For example, process-based multitasking enables you to run the Java compiler at
the same time that you are using a text editor.
Thread-based Multitasking
Threads share the same address space.
Page 8
Packages & Multithreading
Thread is lightweight.
Cost of communication between the thread is low.
If you have programmed for operating systems such as Windows, then you are
already familiar with multithreaded programming.
For instance, a text editor can format text at the same time that it is printing, as
long as these two actions are being performed by two separate threads.
1. New
2. Runnable
3. Running
4. Non-Runnable (Blocked)
5. Terminated
Page 9
New Thread New Born Interfaces, Packages & Multithreading
stop
start
stop Dead
Active State
Running Runnable
Thread
yield
Suspend stop
resume
Sleep
Wait notify
Idle Thread
(Not Runnable) Blocked
1) New
The thread is in new state if you create an instance of Thread class but before the
invocation of start() method.
2) Runnable
The thread is in runnable state after invocation of start() method, but the thread
scheduler has not selected it to be the running thread.
3) Running
The thread is in running state if the thread scheduler has selected it.
4) Non-Runnable (Blocked)
This is the state when the thread is still alive, but is currently not eligible to run.
5) Terminated
A thread is in terminated or dead state when its run() method exits.
Thread class:
Thread class provide constructors and methods to create and perform operations on a
thread. Thread class extends Object class and implements Runnable interface.
Thread()
Thread(String name)
Thread(Runnable r)
Thread(Runnable r,String name)
When a Java program starts up, one thread begins running immediately. This is
usually called the main thread of the program, because it is the one that is executed
when the program begins.
The main thread is important for two reasons:
• It is the thread from which other “child” threads will be spawned.
• Often, it must be the last thread to finish execution because it performs various
shutdown actions.
Although the main thread is created automatically when the program is started, it can
be controlled through a Thread object. To do so, we must obtain a reference to it by
calling the method currentThread( ), which is a public static member of Thread.
Its general form is shown here:
static Thread currentThread( )
It returns a reference to the thread in which it is called.
Program: Write a java program to illustrate Controlling the main Thread.
class CurrentThreadDemo {
public static void main(String args[]) {
Thread t = [Link]();
[Link]("Current thread: " + t);
// change the name of the thread
[Link]("My Thread");
[Link]("After name change: " + t);
try {
for(int n = 5; n > 0; n--) {
[Link](n);
[Link](1000);
}
} catch (InterruptedException e) {
Output:
Current thread: Thread[main,5,main]
After name change: Thread[My Thread,5,main]
5
4
3
2
1
Output:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
Step 1
Implement a run() method provided by a Runnable interface. This method provides an
entry point for the thread and you will put your complete business logic inside this
method.
Following is a simple syntax of the run() method −
public void run( ) { }
Step 2
As a second step, you will instantiate a Thread object using the following constructor −
Thread(Runnable threadObj, String threadName);
Where, threadObj is an instance of a class that implements the Runnable interface
and threadName is the name given to the new thread.
Step 3
Once a Thread object is created, you can start it by calling start() method, which
executes a call to run( ) method.
Following is a simple syntax of start() method −
void start();
Program: Write a java program to create threads by implementing Runnable interface.
// Create a second thread.
class NewThread implements Runnable {
Thread t;
NewThread() {
// Create a new, second thread
t = new Thread(this, "Demo Thread");
[Link]("Child thread: " + t);
[Link](); // Start the thread
}
// This is the entry point for the second thread.
public void run() {
try {
for(int i = 5; i > 0; i--) {
[Link]("Child Thread: " + i);
[Link](500);
}
} catch (InterruptedException e) {
[Link]("Child interrupted.");
}
[Link]("Exiting child thread.");
}
}
class ThreadDemo {
public static void main(String args[]) {
new NewThread(); // create a new thread
try {
for(int i = 5; i > 0; i--) {
[Link]("Main Thread: " + i);
[Link](1000);
}
} catch (InterruptedException e) {
[Link]("Main thread interrupted.");
}
[Link]("Main thread exiting.");
}
}
Output:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
try {
// wait for other threads to end
[Link](10000);
} catch (InterruptedException e) {
[Link]("Main thread Interrupted");
}
[Link]("Main thread exiting.");
}
}
Output:
New thread: Thread[One,5,main]
New thread: Thread[Two,5,main]
New thread: Thread[Three,5,main]
One: 5
Two: 5
Three: 5
One: 4
Two: 4
Three: 4
One: 3
Three: 3
Two: 3
One: 2
Three: 2
Two: 2
One: 1
Three: 1
Two: 1
One exiting.
Two exiting.
Three exiting.
Main thread exiting.
Thread Priorities
Thread priorities are used by the thread scheduler to decide when each thread
should be allowed to run. The higher-priority threads get more CPU time than lower-
priority threads.
Program: Write a java program to illustrate the use of isAlive() and join() methods.
class NewThread implements Runnable {
String name; // name of thread
Thread t;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
[Link]("New thread: " + t);
[Link](); // Start the thread
}
// This is the entry point for thread.
public void run() {
try {
for(int i = 5; i > 0; i--) {
[Link](name + ": " + i);
[Link](1000);
}
} catch (InterruptedException e) {
[Link](name + " interrupted.");
}
[Link](name + " exiting.");
}
}
class DemoJoin {
public static void main(String args[]) {
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
NewThread ob3 = new NewThread("Three");
Output:
New thread: Thread[One,5,main]
New thread: Thread[Two,5,main]
New thread: Thread[Three,5,main]
Thread One is alive: true
Thread Two is alive: true
Thread Three is alive: true
Waiting for threads to finish.
One: 5
Two: 5
Three: 5
One: 4
Two: 4
Three: 4
One: 3
Two: 3
Three: 3
One: 2
Two: 2
Three: 2
One: 1
Two: 1
Three: 1
Two exiting.
Three exiting.
One exiting.
Thread One is alive: false
Thread Two is alive: false
Thread Three is alive: false
Main thread exiting.
Thread Synchronization
When two or more threads need access to a shared resource, they need some
way to ensure that the resource will be used by only one thread at a time. The process
by which this is achieved is called synchronization.
The synchronization is mainly used to
1. To prevent thread interference.
2. To prevent inconsistency problem.
Principle: The key principle of synchronization is the concept of the monitor.
Monitor:
A monitor is an object that is used as a mutually exclusive lock, or mutex. Only
one thread can own a monitor at a given time. When a thread acquires a lock, it is said to
have entered the monitor. All other threads attempting to enter the locked monitor will
be suspended until the first thread exits the monitor. These other threads are said to be
waiting for the monitor.
Using Synchronized Methods
To enter an object’s monitor, just call a method that has been modified with the
synchronized keyword. While a thread is inside a synchronized method, all other
threads that try to call it (or any other synchronized method) on the same instance have
to wait. To exit the monitor and relinquish control of the object to the next waiting
thread, the owner of the monitor simply returns from the synchronized method.
Example:
Suppose two different threads are performing two operations writing and
reading a same file at a time. The file should be available to one thread at a time. Hence
the two methods, on which the threads are trying to access a file, must be synchronized.
synchronized public void write(char ch) {
;
}
Method Description
public final void wait() throws
waits until object is notified.
InterruptedException
public final void wait(long timeout) throws waits for the specified amount
InterruptedException of time.
2. notify( ) method
Wakes up a single thread that is waiting on this object's monitor. If any threads
are waiting on this object, one of them is chosen to be awakened.
Syntax: public final void notify()
3. notifyAll( ) Method
Wakes up all threads that are waiting on this object's monitor.
Syntax: public final void notifyAll( )
Program: Write a java program that correctly implements producer-consumer problem using
the concept of inter thread communication.
Source Code:
class Q
{
boolean valueSet=false;
int n;
synchronized int get()
{
if(!valueSet)
try
{
wait();
}
catch(InterruptedException e)
{
[Link]("Exception is:"+e);
}
[Link]("got:"+n);
valueSet = false;
notify();
return n;
}
synchronized void put(int n)
{
if(valueSet)
try
{
wait();
}
catch(InterruptedException e)
{
[Link]("\n Exception in put:"+e);
}
this.n=n;
valueSet=true;
[Link]("\n put:"+n);
notify();
}
}
class Producer implements Runnable
{
Q q;
Producer(Q q)
{
this.q=q;
new Thread(this,"Producer").start();
}
public void run()
{
int i=0;
while(true)
[Link](i++);
}
}
class Consumer implements Runnable
{
Q q;
Consumer(Q q)
{
this.q=q;
new Thread(this,"Consumer").start();
}
public void run()
{
while(true)
[Link]();
}
}
class ProducerConsumer
{
public static void main(String args[])
{
Q q=new Q();
new Producer(q);
new Consumer(q);
}
}
Output:
put: 1
got: 1
put: 2
got: 2
put: 3
got: 3
put: 4
got: 4
put: 5
got: 5
class SuspendResume {
public static void main(String args[]) {
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
try {
[Link](1000);
[Link]();
[Link]("Suspending thread One");
[Link](1000);
[Link]();
[Link]("Resuming thread One");
[Link]();
[Link]("Suspending thread Two");
[Link](1000);
[Link]();
[Link]("Resuming thread Two");
} catch (InterruptedException e) {
[Link]("Main thread Interrupted");
}
// wait for threads to finish
try {
[Link]("Waiting for threads to finish.");
[Link]();
[Link]();
} catch (InterruptedException e) {
[Link]("Main thread Interrupted");
}
[Link]("Main thread exiting.");
}
}
Output:
New thread: Thread[One,5,main]
One: 15
New thread: Thread[Two,5,main]
Two: 15
One: 14
Two: 14
One: 13
Two: 13
One: 12
Two: 12
One: 11
Two: 11
Suspending thread One
Two: 10
Two: 9
Two: 8
Two: 7
Two: 6
Resuming thread One
Suspending thread Two
One: 10
One: 9
One: 8
One: 7
One: 6
Resuming thread Two
Waiting for threads to finish.
Two: 5
One: 5
Two: 4
One: 4
Two: 3
One: 3
Two: 2
One: 2
Two: 1
One: 1
Two exiting.
One exiting.
Main thread exiting.