手把手教你做一个java线程池小例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
废话不多说开整
我用的是eclipse(这应该没多大影响)
建一个工程java工程和web工程都行然后建一个包建一个类带main方法
首先贴出来的是内部类
//继承了runnable接口
class MyTask implements Runnable {
private int taskNum;
public MyTask(int num) {
this.taskNum = num;
}
@Override
public void run() {
System.out.println("正在执行task "+taskNum);
try {
//写业务
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task "+taskNum+"执行完毕!");
}
}
接下来就是这个类
public class testOne {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 7, 10, LISECONDS, new ArrayBlockingQueue
for(int i=0;i<15;i++){
MyTask myTask = new MyTask(i);
executor.execute(myTask);
System.out.println("线程池中线程数目:
"+executor.getPoolSize()+"队列等待执行的任务数目:"+
executor.getQueue().size()+"已经执行完别的任务数目:
"+executor.getCompletedTaskCount());
}
executor.shutdown();
}
}
接下来在说明一下ThreadPoolExecutor的参数设置ThreadPoolExecutor(int corePoolSize,//线程池维护线程的最少数量
int maximumPoolSize,//线程池维护线程的最大数量
long keepAliveTime,//线程池维护线程所允许的空闲时间
TimeUnit unit, 线程池维护线程所允许的空闲时间单位
BlockingQueue workQueue,线程池所使用的缓存队列
RejectedExecutionHandler handler线程池对拒绝任务的处理策略
)
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()
重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
上面是一个例子接下来再来一个例子
建立一个类继承Runnable接口,大概是这样:
public class BelongTo2 implements Runnable {
@Override
public void run() {
try {
//当前线程休眠2秒当然也可以写业务
System.out.print("东西");
Thread.currentThread().sleep(2000);
System.out.print("\n");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
然后再
建立一个类带main方法,大概是这样:
public class Test2 {
public static void main(String[] args) {
//创建定长线程池大小为5
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
for(int i=0;i<20;i++){
BelongTo2 th=new BelongTo2();
fixedThreadPool.execute(th);
}
fixedThreadPool.shutdown();
}
}
运行就可以了。
简单介绍一下ExecutorService 这个类创建一个定长线程池,可控制线程最大并发数(后面的参数就是并发线程的数量),超出的线程会在队列中等待。