Sunday, April 11, 2010

Java Concurrency/Threads

Process vs Thread
Process - is a running program that runs independently from other processes. It has its own address space and cannot directly access resources of other processes. Each process can have one or more threads.

Thread - is sometimes called lightweight process. Both processes and threads provide an execution environment, but creating a new thread requires fewer resources than creating a new process. Threads share the process's resources, including memory and open files.

2 ways to define a Thread:
  1. implement Runnable interface
    - more general, can have many superclass
    - starting: (new Thread(new HelloRunnable())).start();
  2. extend Thread class (Thread class itself implements Runnable)
    - simpler but limited
    - starting: (new HelloThread()).start();

Thread methods:
  • public void run() - the only method coming from Runnable
  • public void start() - calls the run() method, can only be called once
  • public static void sleep(long millis)/(long millis, int nanos) throws InterruptedException - suspend execution for a specified period
    - time is not guaranteed
    - can be interrupted
  • public void interrupt() - indicates that thread should stop
  • public static boolean interrupted() - interrupted status is cleared
  • public boolean isInterrupted() - has no effect on interrupted status
  • public final void stop()/suspend()/resume() - deprecated

ObjectThread
notify
notifyAll
wait
sleep
yield


Source: http://java.sun.com/docs/books/tutorial/essential/index.html
http://www.vogella.de/articles/JavaConcurrency/article.html

Thursday, April 1, 2010

Using Resource Bundle

ResourceBundle is a class used for containing locale-specific data. A Locale defines the user's environment particularly its language and region. A certain number in one locale may be written differently in another. Likewise, a label of a "Cancel" button may differ in different locales. Using ResourceBundle will allow you to handle these different locales without having to hard-code the locale-specific data.

Sample of retrieving locale-specific data
list of resource bundles:
ButtonLabel
ButtonLabel_de
ButtonLabel_en_GB
ButtonLabel_fr_CA_UNIX


selecting the locale-specific ButtonLabel resource bundle:
Locale currentLocale = new Locale("fr", "CA", "UNIX");
ResourceBundle introLabels =
ResourceBundle.getBundle("ButtonLabel", currentLocale);


2 Types of ResourceBundle
  1. PropertyResourceBundle - uses a properties file to contain the key-value pairs. The value can only be a String.

    properties files for 3 resource bundles:
    LabelsBundle.properties
    LabelsBundle_de.properties
    LabelsBundle_fr.properties

    resource bundle sample content:
    # This is the LabelsBundle_de.properties file
    s1 = Computer
    s2 = Platte
    s3 = Monitor
    s4 = Tastatur

    use of resource bundle sample:
    Locale[] supportedLocales = {
    Locale.FRENCH,
    Locale.GERMAN,
    Locale.ENGLISH
    };

    for (int i = 0; i < supportedLocales.length; i ++) {
    ResourceBundle labels =
    ResourceBundle.getBundle("LabelsBundle",currentLocale);

    String value = labels.getString(key);
    Enumeration bundleKeys = labels.getKeys();
    while (bundleKeys.hasMoreElements()) {
    String key = (String)bundleKeys.nextElement();
    String value = labels.getString(key);
    }
    }

  2. ListResourceBundle - uses a list to contain the key-value pairs. The value can be any object.

    3 resource bundles:
    StatsBundle_en_CA.class
    StatsBundle_fr_FR.class
    StatsBundle_ja_JP.class

    resource bundle sample:
    import java.util.*;
    public class StatsBundle_ja_JP extends ListResourceBundle {
    public Object[][] getContents() {
    return contents;
    }
    private Object[][] contents = {
    { "GDP", new Integer(21300) },
    { "Population", new Integer(125449703) },
    { "Literacy", new Double(0.99) },
    };
    }

    use of resource bundle sample:
    Locale[] supportedLocales = {
    new Locale("en","CA"),
    new Locale("ja","JP"),
    new Locale("fr","FR")
    };

    for (int i = 0; i < supportedLocales.length; i ++) {
    ResourceBundle stats =
    ResourceBundle.getBundle("StatsBundle",currentLocale);

    Integer gdp = (Integer)stats.getObject("GDP");
    }

Notes:
- things to check/consider when internationalizing: http://java.sun.com/docs/books/tutorial/i18n/intro/checklist.html
- numbers, dates, times, or currencies need not be isolated in a ResourceBundle because only the display format of these objects varies with Locale, the objects themselves do not
- it is better to have multiple ResourceBundle by determining related objects and grouping them together
- ResourceBundle.Control class provides a way to control the instantiation and location of resource bundles. You can override its methods to behave differently.
- list of language codes (ISO-639): http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt
- list of country codes (ISO-3166): http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

Source: http://java.sun.com/docs/books/tutorial/i18n/resbundle/index.html