There are two ways to create your own thread type: subclass java.lang.Thread class, or implementing java.lang.Runnable and pass it to Thread constructor or java.util.concurrent.ThreadFactory. What is the difference, and which one is better?
1, The practical reason is, a Java class can have only one superclass. So if your thread class extends java.lang.Thread, it cannot inherit from any other classes. This limits how you can reuse your application logic.
2, From a design point of view, there should be a clean separation between how a task is identified and defined, between how it is executed. The former is the responsibility of a Runnalbe impl, and the latter is job of the Thread class.
3, A Runnable instance can be passed to other libraries that accept task submission, e.g., java.util.concurrent.Executors. A Thread subclass inherits all the overhead of thread management and is hard to reuse.
4, Their instances also have different lifecycle. Once a thread is started and completed its work, it's subject to garbage collection. An instance of Runnalbe task can be resubmitted or retried multiple times, though usually new tasks are instantiated for each submission to ease state management.
Showing posts with label design. Show all posts
Showing posts with label design. Show all posts
Monday, 26 December 2011
Extend Thread vs implement Runnable
Thursday, 16 September 2010
Making library of books
To have library we can have 2 components for sure:
1. Books
2. Person borrowing that books
So we need a person class
1. Books
2. Person borrowing that books
So we need a person class
class Person
{
String name;
public Person (String n)
{
name = n;
}
public String details ()
{
return name;
}
public String toString()
{
return "name <"+name+">";
}
}
Person must take membership from library...so something has to be added to above
class Membership
{
public boolean canLoan(int onLoan)
{
return false;
}
}
class JuniorMember extends Membership
{
public boolean canLoan(int onLoan)
{
return onLoan<1;
}
public String toString()
{
return "Junior";
}
}
class StandardMember extends Membership
{
public boolean canLoan(int onLoan)
{
return onLoan<6;
}
public String toString()
{
return "Standard";
}
}
class OAPMember extends Membership
{
public boolean canLoan(int onLoan)
{
Calendar now = Calendar.getInstance();
int day = now.get(Calendar.DAY_OF_WEEK);
//if (day==Calendar.SATURDAY || day==Calendar.SUNDAY)
if (day == Calendar.THURSDAY)
return false;
return true;
}
public String toString()
{
return "OAP";
}
}
We have to add how many books person borrowed...so we have to add following function:
So now person class become:
public class Person
{
String name;
Membership mem;
int books;
public Person (String n, Membership member)
{
name = n;
mem = member;
}
public boolean borrow(Book b)
{
if (b.canLoan() && mem.canLoan(books))
{
books++;
return true;
}
return false;
}
public String details ()
{
return name+":"+mem;
}
public String toString()
{
return "name <"+name+"> "+mem;
}
}
Extending books to loanable and reference books
class LoanBook extends Book
{
public LoanBook (String t, String a, int c1, int c2, float p)
{
super(t,a,c1,c2,p);
}
public boolean canLoan()
{
return true;
}
public String details ()
{
return "Loan: "+super.details();
}
public String toString()
{
return "loan: "+super.toString();
}
}
class ReferenceBook extends Book
{
public ReferenceBook (String t, String a, int c1, int c2, float p)
{
super(t,a,c1,c2,p);
}
public boolean canLoan()
{
return false;
}
public String details ()
{
return "Reference: "+super.details();
}
public String toString()
{
return "Ref: "+super.toString();
}
}
class Loan
{
Book book;
Person person;
Date date = new Date();
public Loan (Book b, Person p)
{
book = b;
person = p;
}
public String details ()
{
return book.details()+" loaned on "+date+" to "+person.details();
}
public String toString()
{
return "book "+book+" -> person"+person+" @date "+date;
}
}
public class Library
{
public static void main(String[] args)
{
Book b1 = new LoanBook ("Java I/O Programming","E.R.Harrold",123,45,18.99F);
Book b2 = new LoanBook ("Java in a Nutshell","D.Flanagan",123,25,12.99F);
Book b3 = new ReferenceBook ("The Java CLass Libraries","P.Chan & R.Lee",2123,10,35.00F);
System.out.println("Books");
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println("");
System.out.println("People:");
Person james = new Person ("James Gosling");
System.out.println(james);
System.out.println("");
Loan l1 = makeLoan(james, b1);
Loan l2 = makeLoan(james, b2);
Loan l3 = makeLoan(james, b3);
}
private static Loan makeLoan(Person p, Book b)
{
Loan l=null;
if (b.canLoan())
{
l = new Loan(b,p);
System.out.println(l.details());
}
else
System.out.println("Cannot loan "+b.details()+" to "+p.details());
System.out.println("");
return l;
}
}
Book class 1
class Book
{
String title;
String author;
float price;
int cat, subCat;
public Book (String t, String a, int c1, int c2, float p)
{
title = t;
author = a;
price = p;
cat = c1;
subCat = c2;
}
public String details ()
{
return title+", "+author+" Category "+cat+"."+subCat+" value $"+price;
}
public String toString()
{
return "Title <"+title+"> Author <"+author+"> cat:"+cat+" subCat:"+subCat+" price:"+price;
}
}
Subscribe to:
Comments (Atom)