線程池
我們在項目中往往會創(chuàng)建線程以方便使用,但如果在并發(fā)的線程數(shù)量多,并每個線程都執(zhí)行一個時間很短的任務(wù)就結(jié)束時,就會頻繁的創(chuàng)建線程,這樣會降低系統(tǒng)的效率拖慢運(yùn)行時間.在java中我們有更好的辦法來實現(xiàn)這樣的效果,就是線程池.
利用線程池的好處:
- 降低資源的消耗,通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的銷毀.
- 提高響應(yīng)速度,當(dāng)任務(wù)到達(dá)時,任務(wù)可以不需要等線程創(chuàng)建就能立即執(zhí)行.
- 提高線程的可管理性,線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配.
java通過EXecutors提供了四種線程池
- newCachedThreadPool 創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則創(chuàng)建新線程.
- newFixedThreadPool創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待.
- newScheduledThreadPool創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行.
- newSingleThreadExecutor創(chuàng)建一個單程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序執(zhí)行.
newCachedThreadPool
java代碼
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
Executor ex = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
Thread.sleep(index * 1000);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程1");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("線程2");
}
}).start();
ex.execute(new Runnable() {
@Override
public void run() {
synchronized (this) {
System.out.println("線程三");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
notifyAll();
}
}
});
}
}
}
線程1
線程2
線程三
線程1
線程2
線程三
newFixedThreadPool
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
//線程池 防止頻繁的創(chuàng)建線程 減少
public class Test3 {
public static void main(String[] args) {
//創(chuàng)建線程池
Executor ec = Executors.newFixedThreadPool(3);//int 線程池中保留的個數(shù)
ec.execute(new Runnable() {
@Override
public void run() {
System.out.println("線程1");
}
});
ec.execute(new Runnable() {
@Override
public void run() {
System.out.println("線程2");
}
});
}
}
newScheduledThreadPool
package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
}
}
結(jié)果延遲3秒執(zhí)行.
newSingleThreadExecutor
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
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() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
結(jié)果一次輸出,相當(dāng)于順序執(zhí)行.
- corePoolSize 核心池的大小,基本大小,即在沒有任務(wù)需要執(zhí)行的時候線程池的大小
- maximunPoolSize 線程池最大線程數(shù) 表示在線程池中最多能創(chuàng)建多少個線程.線程中當(dāng)前線程數(shù)目不會超過這個值.