Difference between Thread class and Runnable interface

  1. Thread is a block of code which can execute concurrently with other threads in the JVM. You can create and run a thread in either ways; Extending Thread class, Implementing Runnable interface.
  2. Both approaches do the same job but there have been some differences. Almost everyone have this question in their minds: which one is best to use? We will see the answer at the end of this post.
The most common difference is
  • When you extends Thread class, after that you can’t extend any other class which you required. (As you know, Java does not allow inheriting more than one class).
  • When you implements Runnable, you can save a space for your class to extend any other class in future or now.
However, the significant difference is.
  • When you extends Thread class, each of your thread creates unique object and associate with it.
  • When you implements Runnable, it shares the same object to multiple threads.
 class ImplementsRunnable implements Runnable {  
      private int counter = 0;  
      public void run() {  
           counter++;  
           System.out.println("ImplementsRunnable : Counter : " + counter);  
      }  
 }  
 class ExtendsThread extends Thread {  
      private int counter = 0;  
      public void run() {  
           counter++;  
           System.out.println("ExtendsThread : Counter : " + counter);  
      }  
 }  
 public class ThreadVsRunnable {  
      public static void main(String args[]) throws Exception {  
           //Multiple threads share the same object.  
           ImplementsRunnable rc = new ImplementsRunnable();  
           Thread t1 = new Thread(rc);  
           t1.start();  
           Thread.sleep(1000); // Waiting for 1 second before starting next thread  
           Thread t2 = new Thread(rc);  
           t2.start();  
           Thread.sleep(1000); // Waiting for 1 second before starting next thread  
           Thread t3 = new Thread(rc);  
           t3.start();  
           //Creating new instance for every thread access.  
           ExtendsThread tc1 = new ExtendsThread();  
           tc1.start();  
           Thread.sleep(1000); // Waiting for 1 second before starting next thread  
           ExtendsThread tc2 = new ExtendsThread();  
           tc2.start();  
           Thread.sleep(1000); // Waiting for 1 second before starting next thread  
           ExtendsThread tc3 = new ExtendsThread();  
           tc3.start();  
      }  
 }  

Output of the above program.
ImplementsRunnable : Counter : 1
ImplementsRunnable : Counter : 2
ImplementsRunnable : Counter : 3
ExtendsThread : Counter : 1
ExtendsThread : Counter : 1
ExtendsThread : Counter : 1

Struts2 work flow

  1. ActionContextCleanUp Filter : The ActionContextCleanUp filter is optional and it is useful when integration has to be done with other technologies like SiteMash Plugin.
  2. FilterDispatcher : Next the FilterDispatch is called, which int turn uses the ActionMapper to determine weather to invoke an Action. If the action is requires to be invoked, the FilterDispathcer delegates the control to ActionProxy.
     
  3. ActionProxy : The ActionProxy takes the help from Configuration Files manager, which is initialized from the struts.xml. Then the ActionProxy creates an ActionInvocation, which implements the command pattern. The ActionInvocation process invokes the Interceptors (if configured) and then invokes the Action. The ActionInvocation looks for proper result. Then the result is executed, which involves the rendering of JSP or templates.

    Then the Interceptors are executed again in reverse order. Finally the response returns through the filters configured in web.xml file. If the ActionContextCleanUp filter is configured, the FilterDispatcher does not clean the ThreadLocal ActionContext. If the ActionContextCleanUp filter is not present then the FilterDispatcher will cleanup all the ThreadLocals present.

  4. Struts2 work flow

JDBC vs Hibernate



  1. JDBC:
    1. JDBC stands for Java Database Connectivity allows developers to connect, query and update a database using the Structured Query Language(SQL).
    2.  JDBC API standard provides Java developers to interact with different RDBMS and access table data through Java application without learning RDBMS details and using Database Specific JDBC Drivers.
  2. Hibernate:
    1. Hibernate is an Object-Relational Mapping (ORM) solution for java. It is a powerful, high performance object/relational persistence and query service.
    2. It allows us to develop persistent classes following object-oriented idiom – including association, inheritance and polymorphism.
Difference beetween JDBC and Hibernate.

JDBC 
Hibernate 
With JDBC, developer has to write code to map an object model's data representation to a relational data model and its corresponding database schema.  
Hibernate is flexible and powerful ORM solution to map Java classes to database tables. Hibernate itself takes care of this mapping using XML files so developer does not need to write code for this. 
With JDBC, the automatic mapping of Java objects with database tables and vice versa conversion is to be taken care of by the developer manually with lines of code.  
Hibernate provides transparent persistence and developer does not need to write code explicitly to map database tables tuples to application objects during interaction with RDBMS.  
JDBC supports only native Structured Query Language (SQL). Developer has to find out the efficient way to access database, i.e. to select effective query from a number of queries to perform same task.  
Hibernate provides a powerful query language Hibernate Query Language (independent from type of database) that is expressed in a familiar SQL like syntax and includes full support for polymorphic queries. Hibernate also supports native SQL statements. It also selects an effective way to perform a database manipulation task for an application.  
Application using JDBC to handle persistent data (database tables) having database specific code in large amount. The code written to map table data to application objects and vice versa is actually to map table fields to object properties. As table changed or database changed then it’s essential to change object structure as well as to change code written to map table-to-object/object-to-table. 
Hibernate provides this mapping itself. The actual mapping between tables and application objects is done in XML files. If there is change in Database or in any table then the only need to change XML file properties.  
With JDBC, it is developer’s responsibility to handle JDBC result set and convert it to Java objects through code to use this persistent data in application. So with JDBC, mapping between Java objects and database tables is done manually.  
Hibernate reduces lines of code by maintaining object-table mapping itself and returns result to application in form of Java objects. It relieves programmer from manual handling of persistent data, hence reducing the development time and maintenance cost.  
With JDBC, caching is maintained by hand-coding.  
Hibernate, with Transparent Persistence, cache is set to application work space. Relational tuples are moved to this cache as a result of query. It improves performance if client application reads same data many times for same write. Automatic Transparent Persistence allows the developer to concentrate more on business logic rather than this application code.  
In JDBC there is no check that always every user has updated data. This check has to be added by the developer.  
Hibernate enables developer to define version type field to application, due to this defined field Hibernate updates version field of database table every time relational tuple is updated in form of Java class object to that table. So if two users retrieve same tuple and then modify it and one user save this modified tuple to database, version is automatically updated for this tuple by Hibernate. When other user tries to save updated tuple to database then it does not allow saving it because this user does not have updated data.       

Object states in hibernate

This summary is not available. Please click here to view the post.

Why do use lazy="false"?


It decides whether the child object is loading to the parent or not.
  1. We have to set it in the mapping file of the parent class.If lazy="true" (means not to load child)
  2.  By default the lazy loading is true.
  3.  But some cases we need to load the child object when the parent is loaded.
  4.  So in that case we'll have to write lazy="false".