多语言展示
当前在线:1965今日阅读:167今日分享:16

java线程池的使用

大量的创建线程,会过度消耗计算机资源,对于比较简单的任务可以使用线程池,限制过度创建线程。Java中提供大量的线程池构类,类型多种多样,包括:(1) newCachedThreadPool(2) newFixedThreadPool(3)  newScheduledThreadPool(4) newSingleThreadExecutor
工具/原料
1

Java5或以上

2

Netbeans

方法/步骤
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, 优先级)执行。

注意事项
1

可以查阅相关教学视频

2

实例可以运行

推荐信息