執行緒池原理:

package com.cy.java.api.thread;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
//JUC
public class ThreadPoolTests {
public static void main(String[] args) {
//核心執行緒,核心執行緒滿了,放入佇列,佇列滿了開啟再新執行緒,
int corePoolSize=2;
//最大執行緒數(核心執行緒+新執行緒),最大執行緒數、佇列數都滿了,默認拋例外
int maximumPoolSize=3;
//執行緒池中空閑執行緒等待作業的超時時間
int keepAliveTime=60;
//時間顆粒度轉換(例如keepAliveTime默認單位為毫秒,轉換成秒)
TimeUnit unit=TimeUnit.SECONDS;
//任務佇列,存盤要執行的任務,最大佇列數設為1
BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue<>(1);
//定義執行器
RejectedExecutionHandler handler=
//new ThreadPoolExecutor.AbortPolicy();//不能執行任務時,拋出例外
new ThreadPoolExecutor.CallerRunsPolicy();//由呼叫者去執行
//創建執行緒的工廠
ThreadFactory threadFactory=new ThreadFactory() {
//定義執行緒名
private String prefix="db-service-thread-";
//生成自增長數
private AtomicInteger atomicInteger=new AtomicInteger(0);
@Override
public Thread newThread(Runnable task) {
return new Thread(task,prefix+atomicInteger.incrementAndGet());
}
};
//構建執行緒池物件
ThreadPoolExecutor threadPool= new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler);
//設定休眠時間測驗允許結果,核心執行緒數2,最大執行緒樹3,最大佇列1,超出最大限執行緒數時,由呼叫者去執行,
threadPool.execute(new Runnable() {//task
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+"->execute->task1");
try{Thread.sleep(5000);}catch (Exception e){}
}
});
threadPool.execute(new Runnable() {//task
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+"->execute->task2");
try{Thread.sleep(5000);}catch (Exception e){}
}
});
threadPool.execute(new Runnable() {//task
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+"->execute->task3");
}
});
threadPool.execute(new Runnable() {//task
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+"->execute->task4");
try{Thread.sleep(5000);}catch (Exception e){}
}
});
threadPool.execute(new Runnable() {//task
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+"->execute->task5");
try{Thread.sleep(5000);}catch (Exception e){}
}
});
}
}
/*運行結果:
db-service-thread-1->execute->task1
db-service-thread-2->execute->task2
db-service-thread-3->execute->task4
main->execute->task5
db-service-thread-2->execute->task3
*/
執行緒溢位時出錯:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280674.html
標籤:java
上一篇:Java后端知識體系
