java线程池的使用
1、首先了解一下线程的创建方式:
Tread类用于创建线程new Thread(),使用时必须覆盖其方法,@Overide;一下创建九个线程,并输出任务数。
代码如下
public class TestThread {
public static void main(String[] args) {
for(int i=1;i<10;i++){
final int task=i;
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("task:"+task);
}
}).start();
}
}
}


2、(1)newFixedThreadPool:
创建一个固定线程数的线程池,并给线程分配任务
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
package testexcutor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestExcutor {
public static void main(String[] args) {
ExecutorService fixThreadPool=Executors.newFixedThreadPool(5);
for(int i=1;i<=5;i++){
final int task=i;
fixThreadPool.execute(new Runnable(){
@Override
public void run(){
for(int j=1;j<=5;j++){
System.out.println(Thread.currentThread().getName()+" "+"task:"+task+"times:"+j);
}
}
});
}
fixThreadPool.shutdown();
}
}


3、(2)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
package testexcutor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestExcutor {
public static void main(String[] args) {
ExecutorService cashedThreadPool=Executors.newCachedThreadPool();
for(int i=1;i<=100;i++){
final int task=i;
cashedThreadPool.execute(new Runnable(){
@Override
public void run(){
for(int j=1;j<=5;j++){
System.out.println(Thread.currentThread().getName()+" "+"task:"+task+"times:"+j);
}
}
});
}
cashedThreadPool.shutdown();
}
}
创建100线程,但是由于有线程结束,所有可以回收再利用,不够使用时,再创建一个新的线程。


4、(3) newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
代码:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TsetThreads {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("delay 10 seconds");
}
}, 10, TimeUnit.SECONDS);
scheduledThreadPool.shutdown();
}
}
创建一个线程使其延迟10秒后执行

5、(4) newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
代码:
package testexcutor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestExcutor {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+" "+"task"+index);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
singleThreadExecutor.shutdown();
}
}
只能创建一个线程,所以线程名一致。


6、Java 线程池总结:Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

