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
- public static void main(String[] args) {
- ExecutorService cachedThreadPool
- for (int i = 0; i <10; i++) {
- final int index = i;
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- cachedThreadPool.execute(new Runnable() {
- public void run() {
- System.out.println(index);
- }
- });
- }
- }
newFixedThreadPool
- public static void main(String[] args) {
- ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
- for (int i = 0; i <10; i++) {
- final int index = i;
- fixedThreadPool.execute(new Runnable() {
- public void run() {
- try {
- System.out.println(index);
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
定長執行緒池的大小最好根據系統資源進行設定。如Runtime.getRuntime().availableProcessors()
newScheduleThreadPool()
- public static void main(String[] args) {
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
- for (int i = 0; i <10; i++) {
- scheduledThreadPool.schedule(new Runnable() {
- public void run() {
- System.out.println("delay 3 seconds");
- }
- }, 3, TimeUnit.SECONDS);
- }
- }
newSingleThreadExecutor
按順序執行執行緒,某個時間段只能有一個執行緒存在,一個執行緒死掉,另一個執行緒會補上
- public static void main(String[] args) {
- ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
- for (int i = 0; i <10; i++) {
- final int index = i;
- singleThreadExecutor.execute(new Runnable() {
- public void run() {
- /* System.out.println(index);*/
- try {
- System.out.println(index);
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
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子類的例項,即建立了執行緒物