线程池
问题:在实际应用中不希望无休止的创建线程
解决途径:不管有多少个任务都交给固定的线程数的线程来执行任务
可以让一个线程执行多个任务
创建线程池:
Executors类的
newFixedThreadPool(指定线程数) 方法
返回值是 ExecutorService类型
threadPool
.execute(new Runnable()
...)来执行其中的线程任务(run)
例:用三个线程并发执行是个任务
public static void main(String[] args) {
//创建固定线程数的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//3个线程并发处理10个任务
for (int i = 0; i < 10; i++) {
final int tast = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName()+",执行第"+tast+"个任务的第"+j+"次循环");
}
}
});
}
threadPool.shutdown();
}
还有一些创建线程池的方法:
比如:创建一个可根据需要创建线程的线程池(可以默认帮助我们创建一些线程),
而且会被缓存起来,将来可能再去利用这些线程
Executors.
newCachedThreadPool
()
public static void main(String[] args) {
//自动创建一些线程,并且缓存起来
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int tast = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName()+",执行第"+tast+"个任务的第"+j+"次循环");
}
}
});
}
threadPool.shutdown();
}
比如:创建一个线程池,它可安排在给定延迟后运行命令或者定期执行
Executors.
newScheduledThreadPool
(1)
//每两秒执行一次run中的方法
public static void main(String[] args) {
//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(1);
//创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期
threadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("爆炸……");
}
},0, 2, TimeUnit.SECONDS);
}