Tagged: Programming Practice Toggle Comment Threads | Keyboard Shortcuts

  • Subinkrishna Gopi 3:12 pm on February 19, 2010 Permalink |
    Tags: , executor, , Programming Practice, , thread pool, threadpoolexecutor   

    ThreadPoolExecutor – basics 

    ThreadPoolExecutor is an implementation of the ExecutorService, which can be used to execute the submitted tasks using the available Thread pool. Read the Sun Java API docs for more information.

    The buzz words

    1. Core & max pool size
    This is the size of the core (minimam) and maximum possible thread that need to be in the thread pool every time. We can even specify the keep-alive time limit for the threads.

    2. Work queue
    Work queue is a BlockingQueue, which is used to hold the work/task which is being sent to the executor when all the threads in the pool are busy executing the tasks. Read more about the BlockingQueue in Sun Java API docs.

    3. RejectedExecutionHandler
    So we have a limited number of threads in the pool to execute the tasks and a fixed sized work queue to hold the additional tasks. But what if the work queue overflows! RejectedExecutionHandler can help us in such situations. Read the Sun Java API docs for more.

    Some sample code

    Initializing the ThreadPoolExecutor and sending the task. Here we’ve defined a worksQueue with size 2, core & max pool size is 3 and the threads will expire after 10 seconds. We are also starting a daemon thread to monitor the executor status.

    BlockingQueue<Runnable> worksQueue = new ArrayBlockingQueue<Runnable>(2);
    RejectedExecutionHandler executionHandler = new MyRejectedExecutionHandelerImpl();
    
    // Create the ThreadPoolExecutor
    ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 10,
            TimeUnit.SECONDS, worksQueue, executionHandler);
    executor.allowCoreThreadTimeOut(true);
    
    // Starting the monitor thread as a daemon
    Thread monitor = new Thread(new MyMonitorThread(executor));
    monitor.setDaemon(true);
    monitor.start();
    
    // Adding the tasks
    executor.execute(new MyWork("1"));
    executor.execute(new MyWork("2"));
    executor.execute(new MyWork("3"));
    executor.execute(new MyWork("4"));
    executor.execute(new MyWork("5"));
    executor.execute(new MyWork("6"));
    executor.execute(new MyWork("7"));
    executor.execute(new MyWork("8"));
    
    try
    {
        Thread.sleep(30000);
        executor.execute(new MyWork("9"));
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    

    RejectedExecutionHandler implementation.

    /**
     * The custom {@link RejectedExecutionHandler} to handle the rejected
     * tasks / {@link Runnable}
     */
    public class MyRejectedExecutionHandelerImpl
    implements RejectedExecutionHandler
    {
        @Override
        public void rejectedExecution(Runnable runnable,
                ThreadPoolExecutor executor)
        {
            System.out.println(runnable.toString() + " : I've been rejected ! ");
        }
    }
    

    My task (implements Runnable).

    /**
     * My {@link Runnable} class. Represents a task which need to be executed.
     */
    public class MyWork implements Runnable
    {
        String name;
    
        public MyWork(String name)
        {
            this.name = name;
        }
    
        @Override
        public void run()
        {
            System.out.println(this.name + " : I'm running ! ");
    
            try
            {
                Thread.sleep(5000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
    
            System.out.println(this.name + " : I'm done ! ");
        }
    
        @Override
        public String toString()
        {
            return (this.name);
        }
    }
    

    And the monitor thread.

    /**
     * My monitor thread. To monitor the status of {@link ThreadPoolExecutor}
     * and its status.
     */
    public class MyMonitorThread implements Runnable
    {
        ThreadPoolExecutor executor;
    
        public MyMonitorThread(ThreadPoolExecutor executor)
        {
            this.executor = executor;
        }
    
        @Override
        public void run()
        {
            try
            {
                do
                {
                    System.out.println(
                        String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s",
                            this.executor.getPoolSize(),
                            this.executor.getCorePoolSize(),
                            this.executor.getActiveCount(),
                            this.executor.getCompletedTaskCount(),
                            this.executor.getTaskCount(),
                            this.executor.isShutdown(),
                            this.executor.isTerminated()));
                    Thread.sleep(3000);
                }
                while (true);
            }
            catch (Exception e)
            {
            }
        }
    }
    

    So we have all necessary code blocks in place. If we execute the above code we may get something like this.

    1 : I'm running !
    2 : I'm running !
    3 : I'm running !
    6 : I've been rejected !
    7 : I've been rejected !
    8 : I've been rejected !
    [monitor] [0/3] Active: 1, Completed: 0, Task: 1, isShutdown: false, isTerminated: false
    [monitor] [3/3] Active: 3, Completed: 0, Task: 5, isShutdown: false, isTerminated: false
    1 : I'm done !
    4 : I'm running !
    2 : I'm done !
    5 : I'm running !
    3 : I'm done !
    [monitor] [3/3] Active: 2, Completed: 3, Task: 5, isShutdown: false, isTerminated: false
    [monitor] [3/3] Active: 2, Completed: 3, Task: 5, isShutdown: false, isTerminated: false
    4 : I'm done !
    5 : I'm done !
    [monitor] [3/3] Active: 0, Completed: 5, Task: 5, isShutdown: false, isTerminated: false
    [monitor] [2/3] Active: 0, Completed: 5, Task: 5, isShutdown: false, isTerminated: false
    [monitor] [2/3] Active: 0, Completed: 5, Task: 5, isShutdown: false, isTerminated: false
    [monitor] [0/3] Active: 0, Completed: 5, Task: 5, isShutdown: false, isTerminated: false
    [monitor] [0/3] Active: 0, Completed: 5, Task: 5, isShutdown: false, isTerminated: false
    [monitor] [0/3] Active: 0, Completed: 5, Task: 5, isShutdown: false, isTerminated: false
    9 : I'm running !
    [monitor] [1/3] Active: 1, Completed: 5, Task: 6, isShutdown: false, isTerminated: false
    [monitor] [1/3] Active: 1, Completed: 5, Task: 6, isShutdown: false, isTerminated: false
    9 : I'm done !
    [monitor] [1/3] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
    [monitor] [1/3] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
    [monitor] [1/3] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false
    

     
    • nguyenhuuquan 9:28 pm on April 29, 2013 Permalink

      thanks, it’s helpful. I have a question: if a task take a long time to execute, how to terminate it?

  • Subinkrishna Gopi 10:47 am on October 6, 2009 Permalink |
    Tags: , , Programming Practice, , , ,   

    Todays read: Mastering CSS Coding 

    Mastering CSS Coding: Getting Started

    An amazingly simple and useful article from Smashing Magazine.

    CSS has become the standard for building websites in today’s industry. Whether you are a hardcore developer or designer, you should be familiar with it. CSS is the bridge between programming and design, and any Web professional must have some general knowledge of it. If you are getting your feet wet with CSS, this is the perfect time to fire up your favorite text editor and follow along in this tutorial as we cover the most common and practical uses of CSS.

    Read it here: http://www.smashingmagazine.com/2009/10/05/mastering-css-coding-getting-started/
    Follow them in twitter

     
  • Subinkrishna Gopi 3:45 pm on August 25, 2009 Permalink |
    Tags: , , , , , Programming Practice, ,   

    How-to: Write web services using Axis2 

    This is a very basic post on writing a web service provider and consumer using Axis2. You can find such posts anywhere in the web. Here I’ve tried to make it as simple as I can.

    Set up: What all we need to do?

    1. Axis2 runtime.
    I tried with WAR distribution from http://ws.apache.org/axis2/download/1_5/download.cgi
    2. A web/app server. I am using Tomcat.

    Using the Axis2 runtime & setting it up

    Extract the Axis2 WAR distribution and keep it in the deploy directory of the server. In case of Tomcat keep it in webapps. This is how my directory structure look like.

    image

    The WEB-INF is the most important directory. Tell you why. Unlike our normal WEB-INF in archives, this directory hold some special sub-directories. Here goes which contains what.

    classes – compiled Java classes. We can find some Axis specific classes here.
    conf – axis.xml (Axis configuration file)
    lib – All necessary Axis2 libraries (JARs)
    modules – Don’t ask me. Even I’m not sure. Did I mention that I’m also a beginner? 🙂
    services – All web service archives & services.list

    Coding: What we need to write?

    1. The service provider. A Java class.
    2. service.xml. The web services descriptor.
    3. build.xml. To build and deploy the web services archive.
    4. The service consumer. Another Java class to consume the services offered

    And we are good to go now. Let’s make our hands dirty with some Java code. This is very simple and kudos to Axis2.

    The service provider: SampleService.java

    package subin.rnd.ws;
    public class SampleService
    {
      public WsOutput doSomething(WsInput anInput)
      {
        System.out.println("doSomething()");
        WsOutput anOutput = new WsOutput();
        anOutput.setResponseString("I did some thing to " + anInput.getName());
        return (anOutput);
     }
    }
    

    WsInput is a sample input class to demonstrate that we can have more complex IO is possible. Similarly WsOutput is the output class. Instead of using WsInput / WsOutput for IO, we can use normal data types like integer, float, string etc too.

    WsInput.java

    package subin.rnd.ws;
    import java.io.Serializable;
    public class WsInput implements Serializable
    {
     private String name;
     public void setName(String name)
     {
       this.name = name;
     }
    
     public String getName()
     {
       return (this.name);
     }
    }
    

    WsOutput.java

    package subin.rnd.ws;
    import java.io.Serializable;
    public class WsOutput implements Serializable
    {
     private String responseString;
    
     public void setResponseString(String response)
     {
       this.responseString = response;
     }
     public String getResponseString()
     {
       return (this.responseString);
     }
    }
    

    We have the Java part of the web-service ready. But that’s not enough. We need to deploy the web-service as an AAR – Axis Archive – file. An AAR  is just another zip file (like a JAR) with a funky extension :D. The AAR should contain the class files along with the services.xml – web service descriptor.

    Web service descriptor: services.xml

    <service name="SampleWs" scope="application">
     <description>Subin's sample webs service</description>
     <messagereceivers>
     <messagereceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
     class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
     <messagereceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
     class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
     </messagereceivers>
     <operation name="doSomething" />
    <parameter name="ServiceClass">subin.rnd.ws.SampleService</parameter>
    </service>
    

    The services.xml is the place where we define the details of the services being offered.

    Build file: build.xml

    <project name="my.webservice.test" default="build.aar">
    <property name="deploy.dir" value=".../webapps/axis2.war/WEB-INF/services" />
    <property name="file.name" value="subinws.aar" />
    
     <target name="build.aar">
       <javac srcdir="src" destdir="bin" />
       <echo>Copying services.xml to bin</echo>
       <copy file="META-INF/services.xml"
           tofile="bin/META-INF/services.xml" overwrite="true"/>
       <jar basedir="bin" destfile="${file.name}" />
       <echo>Deleting services.xml from bin</echo>
       <delete dir="bin/META-INF" />
       <copy file="${file.name}" tofile="${deploy.dir}/${file.name}"  />
     </target>
    
    </project>
    

    So I hope we have an AAR ready, which is copied to the services directory. But we’ve not done yet. Now we have to make an entry in services/services.list file. Just insert the name of the ARR file at the end of it – in this case “subinws.aar”.

    Please wait for part 2.

     
  • Subinkrishna Gopi 4:17 pm on August 13, 2009 Permalink |
    Tags: best practices, , , iphone, , Programming Practice, ,   

    How-to: Create my first iPhone application 

    image

    These days everyone wants to create iPhone applications. But “user retention” is the biggest challenge most the application developers or companies facing. As per some analysis report which I went through sometime back, the amount of returning users/customers is very less. Problems may be the way we (developers) develop those products, not-so-good application usability or even the confused user.

    I think this Smashing magazine article – How to Create Your First iPhone Application – can help us to a great extend.

    What if you had a nickle for every time you heard: "I have the perfect idea for a great application!"? It’s the buzz on the street. The iPhone has created unprecedented excitement and innovation from people both inside and outside the software development community. Still for those outside the development world, the process is a bit of a mystery.

    This how-to guide is supposed to walk you through the steps to make your idea for an iPhone app a reality. This post presents various ideas, techniques, tips, and resources that may come in handy if you are planning on creating your first iPhone application.

    Read the article: http://www.smashingmagazine.com/2009/08/11/how-to-create-your-first-iphone-application/

     
  • Subinkrishna Gopi 10:45 am on June 19, 2009 Permalink |
    Tags: , Programming Practice, , standards, ,   

    Today’s read: 10 Ways To Make Your Site Accessible Using Web Standards 

    Smashing Magazine

    A Smashing Magazine article on making a website accessible using web standards. Nice read.

    Let’s take a look at 10 ways to improve the accessibility of your XHTML website by making it standards-compliant. We’ll go the extra mile and include criteria that fall beyond the standards set by the W3C but which you should follow to make your website more accessible. Each section lists the criteria you need to meet, explains why you need to meet them and gives examples of what you should and shouldn’t do.

    Read the article here: http://www.smashingmagazine.com/2009/06/18/10-ways-to-make-your-site-accessible-using-web-standards/

     
c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Reply
e
Edit
o
Show/Hide comments
t
Go to top
l
Go to login
h
Show/Hide help
shift + esc
Cancel