ゞ沉默是金ゞ

          魚離不開水,但是沒有說不離開哪滴水.
          posts - 98,comments - 104,trackbacks - 0
          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          This article will discuss about Thread pool that uses single thread to execute tasks. From Java 5.0+ one can get such pool from Executors using following method –
          public static ExecutorService newSingleThreadExecutor()
              Creates an Executor that uses a single worker thread operating off an unbounded queue. (Note however that if this single thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks.) Tasks are guaranteed to execute sequentially, and no more than one task will be active at any given time. Unlike the otherwise equivalent newFixedThreadPool(1) the returned executor is guaranteed not to be reconfigurable to use additional threads.



          Example-
          Suppose we have 100 properties files in an application. We have one thread that can read properties file and return a map value.

          Pseudo code – READER THREAD

          Config Reader implements Callable<Map<String, String>
          try{
              // Get the file name in the constructor of thread
              // Check if File exists
              // Read the file and retrun the map object
          }catch(Exception e){
                  //release all the resource
                  //return null
          }

          Main THREAD-
                  // Get a Single thread pool from Executors
           try{
              // Get the list of all properties file in the directory
              // Create a READER THREAD by passing the name of file
              // store the READER thread in the a list
              //release all the thread in one go and get the Map objects
          }catch(Exception e){
                          //release all the resources
                          // print the stack trace
          }finally{
                  //shutdown the thread pool
          }

          package com.jovialjava.blog.threads;

          import java.io.File;
          import java.io.FileInputStream;
          import java.util.ArrayList;
          import java.util.List;
          import java.util.Properties;
          import java.util.concurrent.Callable;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;
          import java.util.concurrent.Future;

          class SingleReader implements Callable<Properties> {

              
          private String name = null;

              
          public SingleReader(String name) {
                  
          this.name = name;
              }

              
          public Properties call() {
                  
          try {
                      File f 
          = new File(name);
                      Properties prop 
          = new Properties();
                      
          if (f.exists() && f.canRead() && f.isFile()) {
                          FileInputStream in 
          = new FileInputStream(f);
                          prop.load(in);
                          
          return prop;
                      } 
          else {
                          System.err.println(
          "Please check about this file:[" + f.getAbsolutePath() + "]");
                          
          return null;
                      }
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                      
          return null;
                  }
              }
          }

          public class SingleThreadPoolExample {
              
          public static String directory = "config";
              
          private static ExecutorService executorPool = null;

              
          public static void main(String args) {
                  
          try {
                      File dir 
          = new File(directory);
                      
          if (dir.isDirectory()) {
                          List
          <Callable<Properties>> fileList = new ArrayList<Callable<Properties>>();
                          String[] files 
          = dir.list();
                          
          /**
                           * Optimization - Single thread executor.
                           
          */
                          executorPool 
          = Executors.newSingleThreadExecutor();

                          
          for (String file : files) {
                              Callable
          <Properties> reader = new SingleReader(dir.getAbsolutePath() + File.separator + file);
                              fileList.add(reader);
                          }
                          List
          <Future<Properties>> results = executorPool.invokeAll(fileList);
                          
          /**
                           * Check how many success and how many failure
                           
          */
                          
          int success = 0, failure = 0;
                          
          for (Future<Properties> result : results) {
                              
          if (result.get() == null) {
                                  failure
          ++;
                              } 
          else {
                                  success
          ++;
                              }
                          }
                          System.out.println(
          "Total number of files [" + fileList.size() + "]");
                          System.out.println(
          "Success Count [" + success + "]");
                          System.out.println(
          "Failure Count [" + failure + "]");
                      } 
          else {
                          
          throw new IllegalArgumentException("There is no such directory name -" + directory);
                      }
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  } 
          finally {
                      
          if (executorPool != null) {
                          executorPool.shutdown();
                      }
                  }
              }

          }
          posted on 2012-08-06 10:49 ゞ沉默是金ゞ 閱讀(1000) 評論(1)  編輯  收藏 所屬分類: Java SE

          FeedBack:
          # re: Part 12: java.util.concurrent : SingleThreadPool Example
          2012-08-06 16:25 | NotNolyJava
          覺得這個(gè)例子用singleThreadExecutor有點(diǎn)牽強(qiáng),singleThreadExecutor應(yīng)該是用來人為的將并行的任務(wù)竄行化:一個(gè)文件100個(gè)任務(wù)想讀寫,這個(gè)時(shí)候?qū)⑦@些任務(wù)用singleThreadExecutor竄行話避免讀寫錯(cuò)亂,但是每個(gè)任務(wù)的提交不受其他任務(wù)的影響,不過樓主用英語寫博客不錯(cuò)啊,好想把英語學(xué)好!  回復(fù)  更多評論
            
          主站蜘蛛池模板: 云霄县| 仁寿县| 习水县| 枞阳县| 桐城市| 邯郸市| 关岭| 西林县| 蒙阴县| 台东县| 罗田县| 达孜县| 界首市| 新化县| 湟中县| 普兰县| 香港| 青田县| 金沙县| 砚山县| 横山县| 贡嘎县| 合山市| 田阳县| 元阳县| 石狮市| 博客| 西昌市| 万年县| 张掖市| 商河县| 房产| 杭锦后旗| 弥勒县| 河西区| 商南县| 石林| 安平县| 汝阳县| 美姑县| 汉源县|