Executor多執行緒框架使用
阿新 • • 發佈:2018-12-12
在我們的JDK1.5的時候JAVA推出一款為了更加方便開發的多執行緒應用而封裝的框架(Executor),相比傳統的Thread類,Executor更加的方便,效能好,更易於管理,而且支援執行緒池。一般在開發爬蟲的時候為了提供爬蟲的效率,需要使用多執行緒,而Executor就是一個非常不錯的選擇。
常用介面:
1)建立固定數目執行緒的執行緒池:
public static ExecutorService newFixedThreadPool(int nThreads)
2)執行一個執行緒
void java.util.concurrent.Executor.execute(Runnable command)
3)檢視當前活動執行緒個數
int java.util.concurrent.ThreadPoolExecutor.getActiveCount()
4)結束掉所有的執行緒
void java.util.concrrent.ExecutorService.shutdonw()
Executor在管理多個執行緒的時候會進行有效的安排。處理,比如建立的時候執行緒池裡有10個執行緒,加入實現執行緒超過10個Executor會進行有效的佇列阻塞和排程。對於我們開發者開說這是透明的,完全不需要關心它內部是怎麼進行的操作。
例項程式碼:
package com.java.executor;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; public class ExecutorTest { private static Integer count = 1; //數量 private static boolean flag = true;//是否執行 public static void main(String[] args) { ExecutorService executorService= Executors.newFixedThreadPool(10);//在連線池中初始化10個執行緒 while(flag){ if(count<=100){ executorService.execute(new Runnable() { @Override public void run() { System.out.println("執行 : " + count++); } }); }else{ //判斷是否有活動執行緒 if(((ThreadPoolExecutor)executorService).getActiveCount()==0){ executorService.shutdown();//結束所有執行緒 flag=false; System.out.println("完成操作"); } } try { Thread.sleep(100);//休息0.1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }
這是Executor簡單的使用方式,方便快捷,學習難度底,在這裡我們為什麼要休息0.1秒呢,在上面這段程式碼上我們是沒有加鎖的,如果不休息在這段程式碼上等count大於100的時候,執行緒還在活動中會導致執行緒沒有進行關閉,加上執行緒執行速度的飛快會超過我們需求,並且在爬蟲爬網頁的時候使用這麼塊的速度是很容易封IP的。