JDK1.5 线程池 - Executors创建线程池

在写后台程序的时候我们往往会用到多线程处理办法,为了尽量减少创建和销毁线程的系统开支,需要通过线程池的模式来维处于并发状态的多线程,jdk1.5 提供了较为方便的线程池维护类库,java.util.concurrent 在并发编程中很常用的实用工具类。
下面简单介绍下使用 Executors 创建线程池的用法:

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

public class Test {

// 创建无界线程池,可以进行自动线程回收
public void createNewCachedThreadPool() {
// 线程池
ExecutorService exec = Executors.newCachedThreadPool();
// 只能2个线程同时访问
final Semaphore semp = new Semaphore(2);
for (int index = 0; index < 10; index++) {
final int temp = index;
Runnable run = new Runnable() {
public void run() {
try {
// 获取许可
semp.acquire();
System.out.println(Thread.currentThread() + " index:"
+ temp);
Thread.sleep((long) (Math.random() * 10000));
// 线程处理完回收
semp.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
}

// 创建固定大小线程池
public void createNewFixedThreadPool() {
// 创建只有 2 个固定线程的线程池
ExecutorService exec = Executors.newFixedThreadPool(2);
Semaphore semp = new Semaphore(2);
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
while (getAvailableThreadNumber(semp) <= 0) {
System.out.println("暂时没有空闲的线程,等待3秒再执行...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
TaskThread tt = new TaskThread(i);
tt.setSemp(semp);
exec.submit(tt);

}
exec.shutdown();
}

private synchronized int getAvailableThreadNumber(Semaphore semp) {
return semp.availablePermits();
}

// 创建单个后台线程的线程池
public void createSingleThreadPool() {
// 创建单个线程线程池
ExecutorService exec = Executors.newSingleThreadExecutor();

for (int i = 0; i < 10; i++) {
TaskThread tt = new TaskThread(i);
// 设置单线程优先级为最高
tt.setPrior(Thread.MAX_PRIORITY);
exec.submit(tt);
}
exec.shutdown();
}

class TaskThread implements Runnable {
private int index;
private int prior;
private Semaphore semp;

public TaskThread() {
this.index = 0;
}

public TaskThread(int index) {
this.index = index;
}

public void setPrior(int prior) {
this.prior = prior;
}

public void setSemp(Semaphore semp) {
this.semp = semp;
}

public void run() {
try {
if (semp != null)
semp.acquire();
if (prior >= Thread.MIN_PRIORITY
&& prior <= Thread.MAX_PRIORITY) {
Thread.currentThread().setPriority(prior);
}
System.out.println(Thread.currentThread() + " index:" + index);
Thread.sleep((long) (Math.random() * 1000));
if (semp != null)
semp.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
Test test = new Test();
test.createNewFixedThreadPool();
test.createNewCachedThreadPool();
test.createSingleThreadPool();
}
}

注意:里面的 Thread.sleep(1); 是不能少的,感觉是有点别扭,如果只是查询之类的处理就可以不要控制,直接将任务添加到线程池中,如果需要数据处理的话就需要判断下当前线程池中有没有空闲的线程再取数据处理。对这一行我的理解是放弃当前线程对其他线程的处理时间片,否则还没来得及控制循环就已经做完了。
基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值