1. 程式人生 > >Java 建立執行緒池的四種方法

Java 建立執行緒池的四種方法

Java通過Executors提供四種執行緒池,分別為:

newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。

newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

執行緒池的作用:

執行緒池作用就是限制系統中執行執行緒的數量。
根 據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制執行緒數量,其他執行緒排 隊等候。一個任務執行完畢,再從佇列的中取最前面的任務開始執行。若佇列中沒有等待程序,執行緒池的這一資源處於等待。當一個新任務需要執行時,如果執行緒池 中有等待的工作執行緒,就可以開始運行了;否則進入等待佇列。

為什麼要用執行緒池:

1.減少了建立和銷燬執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務。

2.可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴下(每個執行緒需要大約1MB記憶體,執行緒開的越多,消耗的記憶體也就越大,最後宕機)。

Java裡面執行緒池的頂級介面是Executor,但是嚴格意義上講Executor並不是一個執行緒池,而只是一個執行執行緒的工具。真正的執行緒池介面是ExecutorService。

比較重要的幾個類:

ExecutorService: 真正的執行緒池介面。

ScheduledExecutorService: 能和Timer/TimerTask類似,解決那些需要任務重複執行的問題。

ThreadPoolExecutor: ExecutorService的預設實現。

ScheduledThreadPoolExecutor: 繼承ThreadPoolExecutor的ScheduledExecutorService介面實現,週期性任務排程的類實現。

要配置一個執行緒池是比較複雜的,尤其是對於執行緒池的原理不是很清楚的情況下,很有可能配置的執行緒池不是較優的,因此在Executors類裡面提供了一些靜態工廠,生成一些常用的執行緒池。


newCachedThreadPool

  1. public static void main(String[] args) {  
  2.         ExecutorService cachedThreadPool
     = Executors.newCachedThreadPool();  
  3.         for (int i = 0; i <10; i++) {  
  4.             final int index = i;  
  5.             try {  
  6.                 Thread.sleep(10);  
  7.             } catch (InterruptedException e) {  
  8.                 e.printStackTrace();  
  9.             }  
  10.             cachedThreadPool.execute(new Runnable() {  
  11.                 public void run() {  
  12.                     System.out.println(index);  
  13.                 }  
  14.             });  
  15.         }  
  16.     }

newFixedThreadPool

  1. public static void main(String[] args) {  
  2.         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  
  3.         for (int i = 0; i <10; i++) {  
  4.             final int index = i;  
  5.             fixedThreadPool.execute(new Runnable() {  
  6.                 public void run() {  
  7.                     try {  
  8.                         System.out.println(index);  
  9.                         Thread.sleep(10);  
  10.                     } catch (InterruptedException e) {  
  11.                         e.printStackTrace();  
  12.                     }  
  13.                 }  
  14.             });  
  15.         }  
  16.     }  

定長執行緒池的大小最好根據系統資源進行設定。如Runtime.getRuntime().availableProcessors()

newScheduleThreadPool()

  1. public static void main(String[] args) {  
  2.         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);  
  3.         for (int i = 0; i <10; i++) {  
  4.             scheduledThreadPool.schedule(new Runnable() {  
  5.                 public void run() {  
  6.                     System.out.println("delay 3 seconds");  
  7.                 }  
  8.             }, 3, TimeUnit.SECONDS);  
  9.         }  
  10.     } 

newSingleThreadExecutor

按順序執行執行緒,某個時間段只能有一個執行緒存在,一個執行緒死掉,另一個執行緒會補上

  1. public static void main(String[] args) {  
  2.         ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();  
  3.         for (int i = 0; i <10; i++) {  
  4.             final int index = i;  
  5.             singleThreadExecutor.execute(new Runnable() {  
  6.                 public void run() {  
  7. /*                  System.out.println(index);*/  
  8.                     try {  
  9.                         System.out.println(index);  
  10.                         Thread.sleep(2000);  
  11.                     } catch (InterruptedException e) {  
  12.                         e.printStackTrace();  
  13.                     }  
  14.                 }  
  15.             });  
  16.         }  
  17.     }  
 執行緒池Demo 
package thread.demo.test;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


class MyThread extends Thread{
	public void run(){
		System.out.println(Thread.currentThread().getName()+"is running");
	}
}


//class MyThread1 implements Runnable{
//	public void run(){
//		System.out.println("====");
//	}
//}




public class ThreadPoolDemo {


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		ExecutorService pool=Executors.newFixedThreadPool(3);
		Thread t1=new MyThread();
		Thread t2=new MyThread();
		Thread t3=new MyThread();
		Thread t4=new MyThread();
		Thread t5=new MyThread();
//		pool.execute(t1);
//		pool.execute(t2);
//		pool.execute(t3);
//		pool.execute(t4);
//		pool.execute(t5);
//		pool.shutdown();
		
		/*
		 * output:
		 * pool-1-thread-2is running 
		 * pool-1-thread-3is running
		 * pool-1-thread-1is running
		 * pool-1-thread-3is running
		 * pool-1-thread-2is running
		 * 
		 */
		
		
//		ExecutorService  pool1=Executors.newCachedThreadPool();
//		pool1.execute(t1);
//		pool1.execute(t2);
//		pool1.execute(t3);
//		pool1.execute(t4);
//		pool1.execute(t5);
//		pool1.shutdown();
		/*
		 * output:
		 * pool-2-thread-2is running
		 * pool-2-thread-3is running
		 * pool-2-thread-1is running
		 * pool-2-thread-4is running
		 * pool-2-thread-5is running
		 */
		
		
//		ExecutorService pool2=Executors.newSingleThreadExecutor();
//		pool2.execute(t1);
//		pool2.execute(t2);
//		pool2.execute(t3);
//		pool2.execute(t4);
//		pool2.execute(t5);
//		pool2.shutdown();
		/*
		 * OutPut:
		 * pool-3-thread-1is running
		 * pool-3-thread-1is running
		 * pool-3-thread-1is running
		 * pool-3-thread-1is running
		 * pool-3-thread-1is running
		 */
		
		ExecutorService pool3=Executors.newScheduledThreadPool(1);
		pool3.execute(new Runnable(){
			public void run(){
				System.out.println(Thread.currentThread().getName()+"====");
			}
		});
		pool3.execute(new Runnable(){
			public void run(){
				System.out.println(Thread.currentThread().getName()+"~~~~");
			}
		});
		pool3.shutdown();
		/*
		 * output:
		 * pool-3-thread-1====
		 * pool-3-thread-1~~~~
		 */
	}


}

相關推薦

java建立執行方法(轉)

java中建立執行緒的四種方法以及區別 Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用四種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)使用Callable和Future建立執行緒

java 建立執行的三方法

在java中使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項,建立執行緒有三種方式: 1.通過繼承Thread類建立執行緒; 2.通過實現Runnable介面建立執行緒; 3.通過使用Callable和Future建立執行緒。 建立執行緒demo

java建立執行方式

參考自:http://blog.csdn.net/longshengguoji/article/details/41126119 java建立執行緒的三種方式 1. 繼承Thread類建立執行緒類 package com.thread; p

java建立執行的兩方法

本人小白一枚,初學java。感覺java學起來非常自然,寫起程式來思路也很清晰,剛剛學完多執行緒程式設計一塊,所以想將一些比較重點的知識點寫下來,防止遺忘。 java中建立一個執行緒有兩種方法: 繼承Thread類,重寫run() 方法 實現 Runnab

Java建立執行的兩方法比較

1 前言 Java提供了執行緒類Thread來建立多執行緒的程式,執行緒類和普通java類並沒有多大差別,只是執行緒類要麼繼承了Thread類,要麼實現了Runnable介面,這也引出了實現執行緒的兩種方式: 1、A extends Thread 2、

Java 建立執行方法

Java通過Executors提供四種執行緒池,分別為:newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發

Java 執行 建立方式

Java通過Executors提供四種執行緒池,分別為: newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。 newFixedThreadPool 建立一個定長執行緒池,可

Java基礎-建立執行的三方法

1.繼承Thread類 1)定義Thread類的子類,並重寫run方法,run方法就是執行緒要執行的任務,將其稱為執行體。 2)建立Thread類子類的物件,即建立了執行緒物件。 3)呼叫執行緒物件的start()方法來啟動該執行緒。 此方法需要覆蓋掉其中的run()方法。 1 public

java建立執行的三方法以及區別

Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)使用Callable和Future建立執行緒 下面

Java併發:建立執行的兩方法:繼承Thread類和實現Runnable介面(一)

【1】瞭解程序與執行緒的概念 程序是一個程式在其自身的地址空間中執行一次活動,是資源申請、排程和獨立執行的單位。 執行緒是程序中的一個單一的連續控制流程,一個程序可以包含一個或多個執行緒。 如果要在

JAVA基礎-實現多執行方法

Java多執行緒實現方式主要有四種:繼承Thread類、實現Runnable介面、實現Callable介面通過FutureTask包裝器來建立Thread執行緒、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,後兩種是帶返回

Java執行面試題》系列-建立執行的三方法及其區別

1. 建立執行緒的三種方法及其區別 1.1 繼承Thread類 首先,定義Thread類的子類並重寫run()方法: package com.zwwhnly.springbootaction.javabase.thread; public class MyFirstThread extends Thread

執行建立執行的三方法

基本概念 程式:是為了完成特定任務,用某種語言編寫的一組指令的集合.即指一段靜態程式碼。 程序:程序是程式的一次執行過程,是系統進行資源分配和處理機排程的一個獨立單位。 程式是一個靜態的概念,程序是一個動態的概念。一個程式多次執行,對應多個程序;不同的程序可以包含同一程式。 執行緒:

Java——實現Java執行的三方法

Java虛擬機器允許應用程式併發地執行多個執行緒。在Java語言中,多執行緒的實現一般有以下3種方法,其中前兩種是最常用的方法。 1.繼承Thread類,重寫run()方法 Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項。並且,啟動執行緒的唯一方法就是通過

執行(一):建立執行的幾方法

概括來說就是兩種:1、繼承Thread類,重寫run方法,然後start。不推薦這種,因為java的單繼承特性。 2、Thread類的建構函式中可以接受Runnable任務,所以只要是Runnable例項就可以作為引數給Thread 一般有兩種建立Runnable例項的方法(1)實現Runn

Java建立執行的三方式

繼承Thread (1)定義Thread類的子類,重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物件。 (3)呼叫執行緒物件的start()方法來啟動該執行緒。

Java執行實現方式

介紹 繼承Thread類,並重寫其run方法 實現Runnable介面 實現Callable介面通過FutureTask包裝器來建立Thread執行緒 執行緒池,使用ExecutorService、Callable、Future實現有返回結果的多執行緒。 其

JAVA執行實現方式

1.繼承Thread  重寫run()方法,該run方法表示執行緒要完成的任務。建立執行緒物件,呼叫物件的start()方法來啟動執行緒。 2.Runnable介面 重寫介面中run方法。建立Runable例項類的例項,並依此例項作為Thread的target來建立Th

Java建立執行的三方式以及優劣對比

Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或者其子類例項。每個執行緒的作用是完成一定的任務,實際上是執行一段程式流 #1. 繼承Thread類建立執行緒類     通過繼承Thread類來建立並啟動多執行緒的步驟如下: 定

Java建立執行的三方式及其對比

Java中建立執行緒主要有三種方式: 一、繼承Thread類建立執行緒類 (1)定義Thread類的子類,並重寫該類的run方法,該run方法的方法體就代表了執行緒要完成的任務。因此把run()方法稱為執行體。 (2)建立Thread子類的例項,即建立了執行緒物