Finance module uses threads with the following attributes:
ThreadGroup = "Finance"
Priority = 7
Reporting module uses threads with the following attributes:
ThreadGroup = "Report"
Priority = 5
Using an AbstractFactoryPattern it is possible to design a framework which will provide transparency to developers in creating threads with application module-specific attributes and also maintaining a centralized control on module-specific thread properties.
Please see below UML Diagram of the Framework:
Please click on diagram to view larger picture
Sample code of framework:
AbstractIF.java
public interface AbstractIF {
public Thread createThread();
}
AbstractFactoryIF.java
public interface AbstractFactoryIF {
public AbstractIF createThread(Runnable runnable);
}
ThreadFactory.java
public class ThreadFactory implements AbstractFactoryIF {
String moduleName;
public ThreadFactory(String moduleName) {
this.moduleName = moduleName;
}
public AbstractIF createThread(Runnable runnable) {
// TODO Auto-generated method stub
if(moduleName.equals("Finance")) {
return new CreateFinanceThread(moduleName,runnable);
}
else if(moduleName.equals("Report")){
return new CreateReportThread(moduleName,runnable);
}
else
return null;
}
}
CreateFinanceThread.java
public class CreateFinanceThread implements AbstractIF {
private String moduleName;
private ThreadGroup threadGroup;
private Runnable runnable;
private Thread t;
private int priority = 7;
public CreateFinanceThread(String moduleName,Runnable runnable) {
this.runnable = runnable;
this.moduleName = moduleName;
}
public Thread createThread() {
// TODO Auto-generated method stub
threadGroup = new ThreadGroup(moduleName);
t = new Thread(threadGroup,runnable);
t.setPriority(priority);
return t;
}
}
CreateReportThread.java
public class CreateReportThread implements AbstractIF {
private String moduleName;
private ThreadGroup threadGroup;
private Runnable runnable;
private Thread t;
private int priority = 5;
public CreateReportThread(String moduleName,Runnable runnable) {
this.runnable = runnable;
this.moduleName = moduleName;
}
public Thread createThread() {
// TODO Auto-generated method stub
threadGroup = new ThreadGroup(moduleName);
t = new Thread(threadGroup,runnable);
t.setPriority(priority);
return t;
}
}
ProcessDelegate.java
public class ProcessDelegate {
private ThreadFactory threadFactory;
private String moduleName;
private Thread t;
public ProcessDelegate(String moduleName) {
this.moduleName = moduleName;
}
public void doproc() {
AbstractFactoryIF factory = new ThreadFactory(moduleName);
AbstractIF thread = factory.createThread(new Runnable() {
public void run() {
doStuff(moduleName);
}
});
t = thread.createThread();
t.start();
}
public void doStuff(String moduleName) {
// do module specific stuff here based on the value of moduleName parameter..
/* The Finance stuff will be run in a thread with:
- ThreadGroup="Finance"
- priority = 7
The Reporting stuff will be run in a thread with:
- ThreadGroup="Report"
- priority = 5
But this will be transparent to the developer using the ProcessDelegate class.
*/
}
}
No comments:
Post a Comment