1. 程式人生 > >java -- 執行緒池例子ExecutorService

java -- 執行緒池例子ExecutorService

package com.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 執行緒池構造工廠
 *
 * @author SHANHY([email protected])
 * @date   2015年12月4日
 */
public class ExecutorServiceFactory
{
private static ExecutorServiceFactory executorFactory = new ExecutorServiceFactory(); /** * 定時任務執行緒池 */ private ExecutorService executors; private ExecutorServiceFactory() { } /** * 獲取ExecutorServiceFactory * * @return */ public static ExecutorServiceFactory getInstance
() { return executorFactory; } /** * 建立一個執行緒池,它可安排在給定延遲後執行命令或者定期地執行。 * * @return */ public ExecutorService createScheduledThreadPool() { // CPU個數 int availableProcessors = Runtime.getRuntime().availableProcessors(); // 建立 executors = Executors.newScheduledThreadPool(availableProcessors * 10
, getThreadFactory()); return executors; } /** * 建立一個使用單個 worker 執行緒的 * Executor,以無界佇列方式來執行該執行緒。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個執行緒, * 那麼如果需要,一個新執行緒將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個執行緒是活動的。與其他等效的 * newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程式即可使用其他的執行緒。 * * @return */ public ExecutorService createSingleThreadExecutor() { // 建立 executors = Executors.newSingleThreadExecutor(getThreadFactory()); return executors; } /** * 建立一個可根據需要建立新執行緒的執行緒池,但是在以前構造的執行緒可用時將重用它們。對於執行很多短期非同步任務的程式而言,這些執行緒池通常可提高程式效能。呼叫 * execute 將重用以前構造的執行緒(如果執行緒可用)。如果現有執行緒沒有可用的,則建立一個新執行緒並新增到池中。終止並從快取中移除那些已有 60 * 秒鐘未被使用的執行緒。因此,長時間保持空閒的執行緒池不會使用任何資源。注意,可以使用 ThreadPoolExecutor * 構造方法建立具有類似屬性但細節不同(例如超時引數)的執行緒池。 * * @return */ public ExecutorService createCachedThreadPool() { // 建立 executors = Executors.newCachedThreadPool(getThreadFactory()); return executors; } /** * 建立一個可重用固定執行緒數的執行緒池,以共享的無界佇列方式來執行這些執行緒。在任意點,在大多數 nThreads * 執行緒會處於處理任務的活動狀態。如果在所有執行緒處於活動狀態時提交附加任務 * ,則在有可用執行緒之前,附加任務將在佇列中等待。如果在關閉前的執行期間由於失敗而導致任何執行緒終止 * ,那麼一個新執行緒將代替它執行後續的任務(如果需要)。在某個執行緒被顯式地關閉之前,池中的執行緒將一直存在。 * * @return */ public ExecutorService createFixedThreadPool(int count) { // 建立 executors = Executors.newFixedThreadPool(count, getThreadFactory()); return executors; } /** * 獲取執行緒池工廠 * * @return */ private ThreadFactory getThreadFactory() { return new ThreadFactory() { AtomicInteger sn = new AtomicInteger(); public Thread newThread(Runnable r) { SecurityManager s = System.getSecurityManager(); ThreadGroup group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); Thread t = new Thread(group, r); t.setName("任務執行緒 - " + sn.incrementAndGet()); return t; } }; } }
package com.threadPool;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

/**
 * 執行緒處理類
 *
 * @author SHANHY([email protected])
 * @date 2015年12月4日
 */
public class ExecutorProcessPool {

    private ExecutorService executor;
    private static ExecutorProcessPool pool = new ExecutorProcessPool();
    private final int threadMax = 10;

    private ExecutorProcessPool() {
        System.out.println("threadMax>>>>>>>" + threadMax);
        executor = ExecutorServiceFactory.getInstance().createFixedThreadPool(threadMax);
    }

    public static ExecutorProcessPool getInstance() {
        return pool;
    }

    /**
     * 關閉執行緒池,這裡要說明的是:呼叫關閉執行緒池方法後,執行緒池會執行完佇列中的所有任務才退出
     * 
     * @author SHANHY
     * @date 2015年12月4日
     */
    public void shutdown() {
        executor.shutdown();
    }

    /**
     * 提交任務到執行緒池,可以接收執行緒返回值
     * 
     * @param task
     * @return
     * @author SHANHY
     * @date 2015年12月4日
     */
    public Future<?> submit(Runnable task) {
        return executor.submit(task);
    }

    /**
     * 提交任務到執行緒池,可以接收執行緒返回值
     * 
     * @param task
     * @return
     * @author SHANHY
     * @date 2015年12月4日
     */
    public Future<?> submit(Callable<?> task) {
        return executor.submit(task);
    }

    /**
     * 直接提交任務到執行緒池,無返回值
     * 
     * @param task
     * @author SHANHY
     * @date 2015年12月4日
     */
    public void execute(Runnable task) {
        executor.execute(task);
    }

}
package com.threadPool;

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * 測試類
 *
 * @author SHANHY([email protected])
 * @date   2015年12月4日
 */
public class ExecutorTest {

    public static void main(String[] args) {

        ExecutorProcessPool pool = ExecutorProcessPool.getInstance();

        for (int i = 0; i < 200; i++) {
            Future<?> future = pool.submit(new ExcuteTask1(i+""));
//          try {
//              如果接收執行緒返回值,future.get() 會阻塞,如果這樣寫就是一個執行緒一個執行緒執行。所以非特殊情況不建議使用接收返回值的。
//              System.out.println(future.get());   
//          } catch (Exception e) {
//              e.printStackTrace();
//          }
        }

        for (int i = 0; i < 200; i++) {
            pool.execute(new ExcuteTask2(i+""));
        }

        //關閉執行緒池,如果是需要長期執行的執行緒池,不用呼叫該方法。
        //監聽程式退出的時候最好執行一下。
        pool.shutdown();
    }

    /**
     * 執行任務1,實現Callable方式
     *
     * @author SHANHY([email protected])
     * @date   2015年12月4日
     */
    static class ExcuteTask1 implements Callable<String> {
        private String taskName;

        public ExcuteTask1(String taskName) {
            this.taskName = taskName;
        }

        @Override
        public String call() throws Exception {
            try {
//              Java 6/7最佳的休眠方法為TimeUnit.MILLISECONDS.sleep(100);
//              最好不要用 Thread.sleep(100);
                TimeUnit.MILLISECONDS.sleep((int)(Math.random() * 1000));// 1000毫秒以內的隨機數,模擬業務邏輯處理
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("-------------這裡執行業務邏輯,Callable TaskName = " + taskName + "-------------");
            return ">>>>>>>>>>>>>執行緒返回值,Callable TaskName = " + taskName + "<<<<<<<<<<<<<<";
        }
    }

    /**
     * 執行任務2,實現Runable方式
     *
     * @author SHANHY([email protected])
     * @date   2015年12月4日
     */
    static class ExcuteTask2 implements Runnable {
        private String taskName;

        public ExcuteTask2(String taskName) {
            this.taskName = taskName;
        }

        @Override
        public void run() {
            try {
                TimeUnit.MILLISECONDS.sleep((int)(Math.random() * 1000));// 1000毫秒以內的隨機數,模擬業務邏輯處理
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("-------------這裡執行業務邏輯,Runnable TaskName = " + taskName + "-------------");
        }

    }
}

相關推薦

java -- 執行例子ExecutorService

package com.threadPool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.con

Java執行ExecutorService)使用

一、前提 /** * 執行緒執行demo,執行時打出執行緒id以及傳入執行緒中引數 */ public class ThreadRunner implements Runnable { private final SimpleDateForm

Java執行例子

/**  *   */ package iotest.serversocket;   im

java 執行 ExecutorService相關歸納

public class ExecutorServiceDemo {     public static void main(String[] args) {          // 單執行緒池  &

Java執行ExecutorService

開篇前,我們先來看看不使用執行緒池的情況: new Thread的弊端 執行一個非同步任務你還只是如下new Thread嗎? ?1234567new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated meth

java執行ThreadPoolExecutor和阻塞佇列BlockingQueue,Executor, ExecutorService

ThreadPoolExecutor 引數最全的建構函式 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

在spring boot中使用java執行ExecutorService

1. 認識java執行緒池 1.1 在什麼情況下使用執行緒池? 1.單個任務處理的時間比較短 2.需處理的任務的數量大 1.2 使用執行緒池的好處: 1.減少在建立和銷燬執行緒上所花的時間以及系統資源的開銷 2.如不使用執行緒池,有可能造成系統建立大量執行緒而導致消耗完系統記

Java執行 ExecutorService

一、ExecutorService介紹 ExecutorService是Java中對執行緒池定義的一個介面,它java.util.concurrent包中,在這個介面中定義了和後臺任務執行相關的方法:  Java API對ExecutorService

Java執行ExecutorService時讓主執行等待子執行完成後繼續處理

(() -> { try { System.out.println(finalI + " 我執行了。。。"); Thread.sleep(5000L);

java 執行簡單例子

package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import com.hra.riskprice.pojo.RskFactor; import com.hra.riskprice.service.impl

java利用執行ExecutorService)配合Callable和Future實現執行方法超時的阻斷

今天在專案開發中需要用到對執行方法加上時間控制,如果方法執行過長則跳出執行,廢話不說,直接上程式碼,用的是執行緒池配合Callable和Future方式對執行方法的超時阻斷。希望各位牛人指正  //啟用執行緒池 final ExecutorServic

Java執行ExecutorService 的理解與使用

介面 java.util.concurrent.ExecutorService 表述了非同步執行的機制,並且可以讓任務在後臺執行。一個 ExecutorService 例項因此特別像一個執行緒池。事實上,在 java.util.concurrent 包中的 Ex

Java執行ExecutorService方法詳解

執行緒在專案中有時候是很重要的一部分,對於那些不需要返回結果只需呼叫而且執行之間較長的方法,可考慮用執行緒實現。但是執行緒的頻繁建立和銷燬會降低系統的效能,因此多執行緒情況下最好要考慮執行緒池技術。 執行緒池的多種建立方式下一節介紹。 建立執行緒池方式: //建立可快

JAVA執行ExecutorService四種模式的建立、使用及區別

ExecutorService ExecutorService是Java中對執行緒池定義的一個介面,它java.util.concurrent包中。Java API對ExecutorService介面的實現有兩個(ThreadPoolExecutor和Schedule

Java執行例子到Tomcat執行

執行緒池的作用:   執行緒池作用就是限制系統中執行執行緒的數量。   根據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制執行緒數量,其他執行緒排隊等候。一個任務執行完畢,再從佇列的中取最前面的

Java執行 ExecutorService( [ɪgˈzekjətə(r)] ) 的運用

一,執行緒池工具類 package demo.util; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 執行緒池工具類(單例模式) *

java執行詳細入門教程即原始碼解析

##1、執行緒池概念      執行緒池是執行緒的集合,通過執行緒池我們不需要自己建立執行緒,將任務提交給執行緒池即可。為什麼要使用執行緒池,首先,使用執行緒池可以重複利用已有的執行緒繼續執行任務,避免執行緒在建立和銷燬時造成的消耗。其次,由

Java執行ThreadPoolExecutor詳解

  1、執行緒池的工作原理?   執行緒池剛建立時,裡面沒有一個執行緒。任務佇列是作為引數傳進來的。不過,就算佇列裡面有任務,執行緒池也不會馬上執行它們。 當呼叫 execute() 方法新增一個任務時,執行緒池會做如下判斷:

Java執行Executor框架詳解

Java的執行緒既是工作單元,也是執行機制。從JDK 5開始,把工作單元與執行機制分離開來。工作單元包括Runnable和Callable,而執行機制由Executor框架提供。 Executor框架簡介在HotSpot VM的執行緒模型中,Java執行緒(java.lang.Thread)被一對一對映為本

java執行(有返回值和無返回值)

無返回值: package ThreadPool2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class test { public stat