import
java.io.*;
import
java.util.*;
class
Thread {
private
int
uniqueId;
private
static
int
uniqueIDGen =
0
;
private
String thread_name;
Thread() { uniqueId = generateUniqueId(); }
public
void
setNameOfThread(String name)
{
thread_name = name;
}
public
String getNameOfThread() {
return
thread_name; }
private
int
generateUniqueId() {
return
uniqueIDGen++; }
public
boolean
compare(Thread t1)
{
if
(t1.uniqueId ==
this
.uniqueId) {
return
true
;
}
else
{
return
false
;
}
}
}
class
ThreadPool {
private
boolean
isFirst =
true
;
private
Thread myThreads[] =
null
;
private
boolean
isUsed[] =
null
;
private
int
n;
private
static
int
noOfThreadPools =
0
;
private
int
ThreadreferenceCount =
0
;
private
int
poolNum =
0
;
public
ThreadPool()
{
noOfThreadPools++;
poolNum = noOfThreadPools;
}
public
boolean
initialize(
int
size)
{
boolean
status =
false
;
if
(
true
== isFirst) {
isFirst =
false
;
n = size;
myThreads =
new
Thread[n];
for
(
int
i =
0
; i < n; i++) {
myThreads[i] =
new
Thread();
String name = Integer.toString(i +
1
);
name = name.concat(
" is the thread number of the pool "
);
name = name.concat(
Integer.toString(poolNum));
myThreads[i].setNameOfThread(name);
}
isUsed =
new
boolean
[n];
for
(
int
i =
0
; i < n; i++) {
isUsed[i] =
false
;
}
status =
true
;
}
return
status;
}
public
Thread getReference()
{
Thread threadToReturn =
null
;
if
(ThreadreferenceCount < n) {
for
(
int
i =
0
; i < n; i++) {
if
(
false
== isUsed[i]) {
threadToReturn = myThreads[i];
isUsed[i] =
true
;
ThreadreferenceCount++;
break
;
}
}
}
return
threadToReturn;
}
public
void
releaseReference(Thread thread)
{
if
(ThreadreferenceCount >
0
) {
for
(
int
i =
0
; i < n; i++) {
if
(
true
== thread.compare(myThreads[i])) {
isUsed[i] =
false
;
ThreadreferenceCount--;
break
;
}
}
}
}
public
boolean
deInitialize()
{
boolean
status =
false
;
if
(isFirst =
false
) {
status =
true
;
}
else
if
(ThreadreferenceCount ==
0
) {
for
(
int
i =
0
; i < n; i++) {
myThreads[i] =
null
;
}
myThreads =
null
;
isUsed =
null
;
n =
0
;
isFirst =
true
;
status =
true
;
}
return
status;
}
}
public
class
Main {
public
static
void
main(String[] args)
{
System.out.println(
"*****************POOL1 Of Threads Created*****************"
);
ThreadPool p1 =
new
ThreadPool();
if
(p1.initialize(
2
)) {
System.out.println(
"Pool 1 initialized"
);
}
else
{
System.out.println(
"Pool 1 not initialized"
);
}
Thread t1 = p1.getReference();
if
(t1 !=
null
) {
System.out.println(t1.getNameOfThread());
}
else
{
System.out.println(
" t1 do not refer any object"
);
}
Thread t2 = p1.getReference();
if
(t2 !=
null
) {
System.out.println(t2.getNameOfThread());
}
else
{
System.out.println(
" t2 do not refer any object"
);
}
Thread t3 = p1.getReference();
if
(t3 !=
null
) {
System.out.println(t3.getNameOfThread());
}
else
{
System.out.println(
" t3 do not refer any object"
);
}
p1.releaseReference(t1);
t1 =
null
;
p1.releaseReference(t2);
t2 =
null
;
if
(p1.initialize(
2
)) {
System.out.println(
"Pool 1 initialized"
);
}
else
{
System.out.println(
"Pool 1 not initialized as it was already initialized\n"
);
}
System.out.println(
"*****************POOL2 Of Threads Created*****************"
);
ThreadPool p2 =
new
ThreadPool();
p2.initialize(
3
);
Thread tp1 = p2.getReference();
if
(tp1 !=
null
) {
System.out.println(tp1.getNameOfThread());
}
else
{
System.out.println(
"tp1 dont refer to any object"
);
}
p2.releaseReference(tp1);
tp1 =
null
;
p1.deInitialize();
p2.deInitialize();
}
}