在写后台程序的时候我们往往会用到多线程处理办法,为了尽量减少创建和销毁线程的系统开支,需要通过线程池的模式来维处于并发状态的多线程,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); 是不能少的,感觉是有点别扭,如果只是查询之类的处理就可以不要控制,直接将任务添加到线程池中,如果需要数据处理的话就需要判断下当前线程池中有没有空闲的线程再取数据处理。对这一行我的理解是放弃当前线程对其他线程的处理时间片,否则还没来得及控制循环就已经做完了。
分享到:
相关推荐
javaJDK1.5---32位和64位,可以下载安装使用 javaJDK1.5---32位和64位,可以下载安装使用
JDK1.5线程池源码及详细注释 深入研究java线程原理
bcprov-jdk1.5on-157.jar欢迎大家下载 好用好用 好用
Linux下配置JDK1.5--MSN:zhoujianguo_leo@hotmail.com
JDK1.5的线程池讲解,示例代码,很精辟~
JDK1.5-1.6-1.7之新特性总结
开发过程中接触到了从jdk1.5---jdk1.7的使用,在不同的阶段,都使用过了jdk的一些新特性,操作起来更加方面啦!特此总结了下,与喜欢it 的朋友共勉!
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin
JDK1.5中的线程池(ThreadPoolExecutor)使用简介
包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)
包含 bcmail-jdk15on-1.58,bcprov-jdk15on-1.58,bcpkix-jdk15on-1.58 3个jar
JDK1.5(jdk-1_5_0-windows-i586) JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握...
前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....
2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program Files (x86)\java\JDK1.6\jre\lib\ext 3.打开java.security文件:在JDK安装目录\jre\lib\security下的java.security文件。
JDK 1.5 - JDK 1.8/2016 bcprov-jdk15on-155 ----------
jdk1.5.exe jdk1.5 jdk1.5下载
bcprov-ext-jdk15on-1.54.jar和bcprov-jdk15on-1.54.jar压缩文件
ibm jdk 1.5 linux 版本,已经在官方网站上下载不了的,官方最低版本就是1.6,目前已经绝版了,经过自己的测试,完全是可以使用的
jdk 这个安装文件不能用 就是为了资源分