线程池是为了避免每次创建线程和销毁线程所带来的性能问题,原理和连接池差不多,在线程池的编程模型下,任务的提交是交给线程池的,而不是直接交给某个线程,线程池拿到某个任务后,它就在线程池内部查找有没有空余的线程,再把任务交给内部某个空余的线程,这就是封装,记住,任务是交给线程池,一个线程同时只能执行一个任务,但可以同时向线程池中提交多个任务。
package Thread02;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolTest {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);//在线程池中放3个线程
ExecutorService threadPool2 = Executors.newCachedThreadPool();//创建缓存线程池,可以自动增加新线程,线程的数目不定
ExecutorService executor = Executors.newSingleThreadExecutor();//创建单一线程池,假如里面的线程死了,它会再创建一个线程
for (int i = 1; i <= 10; i++) {
final int task=i;
threadPool.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int j = 1; j <= 10; j++) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " is loop of " + j+" for task for "+task);
}
}
});
}
System.out.println("has commited!");
threadPool.shutdown();//关闭线程池
}
}
用线程池启动定时器
package Thread02;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadPoolTest {
public static void main(String[] args) {
Executors.newScheduledThreadPool(3).schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("欢迎光临!");
}
}, 2,TimeUnit.SECONDS );
}
}