- /*
- * 线程池:
- *
- * 1.当使用继承Thread的方式实现线程,如果想反复的使用此线程,不能多次调用start();
- * 可以多次实例化此类的对象,然后再启动线程。
- * 2.如果线程的启动,或者构造比较耗时,那么就大大的影响效率;
- * 3.JDK5之后,提供了一个"线程池",这个"线程池"可以缓存一些"线程对象",
- * 如果需要再次使用时,无需重复构造,直接从"池"中取出线程对象使用即可;
- * 4.JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
- public static ExecutorService newCachedThreadPool():创建一个可根据需要创建新线程的线程池
- public static ExecutorService newFixedThreadPool(int nThreads):创建一个可重用固定线程数的线程池
- public static ExecutorService newSingleThreadExecutor():创建一个使用单个 worker 线程的 Executor
- ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法
- Future<?> submit(Runnable task)
- <T> Future<T> submit(Callable<T> task)
- */
- public class Demo {
- public static void main(String[] args) {
- /*MyThread t1 = new MyThread();//需要5秒
- t1.start();
-
- System.out.println("主进程等待2秒......");
- try {
- Thread.sleep(1000 * 2);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println("再次启动MyThread");
- t1 = new MyThread();//再次需要5秒
- t1.start();*/
-
- //获取一个"线程池"对象
- ExecutorService service = Executors.newFixedThreadPool(2);
- MyThread t3 = new MyThread();//需要5秒
- //执行线程t3
- service.submit(t3);
-
- System.out.println("主进程休息2秒钟......");
- try {
- Thread.sleep(1000 * 2);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("主进程再次启动线程......");
- service.submit(t3);//无需再次构造
-
- //将线程池停止
- service.shutdown();
-
-
- }
- }
- package cn.itcast.demo05_线程池;
- public class MyThread extends Thread{
- public MyThread(){
- System.out.println("实例化一个我的对象,很耗时哟,需要5秒钟......");
- for(int i = 0;i < 5 ; i++){
- System.out.println(i + 1);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void run() {
- System.out.println("线程打印:run()......");
- }
- }
复制代码 |
|