首页 > 编程语言 > 详细

java线程池四种简单案例

时间:2020-10-16 17:22:12      阅读:24      评论:0      收藏:0      [点我收藏+]

java线程池四种简单案例

一、固定线程池(固定线程个数

使用 ExecutorService pool=Executors.newFixedThreadPool(3); 创建一个初始线程为3个的线程池 ,如果超过这个线程个数,后面的线程会等待

  代码:

package demo;

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
/** 
 * 固定线程池 
 * 使用Executors.newFixedThreadPool(3)方法指定池中允许执行线程的个数 
 * 如果超过这个线程个数,后面的线程就会等待 
 */  
public class FixedThreadPoolTest {  
    public static void main(String[] args) {  
        //创建一个初始线程为3个的线程池  
        ExecutorService pool=Executors.newFixedThreadPool(3);  
        for(int i=0;i<3;i++){  
            final int task=i;  
            pool.execute(new Runnable() {  
                @Override  
                public void run() {  
                    try {  
                        Thread.sleep(20);  
                    } catch (InterruptedException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                    for(int j=0;j<3;j++){  
                        System.out.println(Thread.currentThread().getName()+"正在进行第"+(task+1)+"个任务,第"+(j+1)+"次循环");  
                    }  
                }  
            });  
        }  
        //关闭线程池  
        pool.shutdown();  
    }  
} 

  执行结果:

技术分享图片

 

 二、缓存线程池(不固定线程个数,池中线程不够,会自动增加线程个数)

使用  ExecutorService pool=Executors.newCachedThreadPool();  创建一个缓存线程池

  代码:

package demo;

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
/** 
 * 缓存线程池 
 * 如果池中的线程不够,会自动增加线程 
 */  
public class CachedThreadPoolTest {  
    public static void main(String[] args) {  
        //创建一个缓存线程池  
        ExecutorService pool=Executors.newCachedThreadPool();  
        for(int i=0;i<3;i++){  
            final int task=i;  
            pool.execute(new Runnable() {  
                @Override  
                public void run() {  
                    try {  
                        Thread.sleep(20);  
                    } catch (InterruptedException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                    for(int j=0;j<3;j++){  
                        System.out.println(Thread.currentThread().getName()+"正在进行第"+(task+1)+"个任务,第"+(j+1)+"次循环");  
                    }  
                }  
            });  
        }  
    }  
}  

  执行结果:

技术分享图片

 

 

三、定时器线程池(定时执行线程)

使用  ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);   创建定时器线程池 

  代码:

package demo;

import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;  
/** 
 * 定时器线程池 
 * 
 */  
public class ScheduledThreadPoolTest {  
    public static void main(String[] args) {  
      method1();  
//        method2();  
    }  
      
    /** 
     * 2秒之后执行线程   只执行一次
     */  
    public static void method1(){  
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);  
        //2秒之后执行这个线程  
        pool.schedule(new Runnable() {  
            @Override  
            public void run() {  
                System.out.println("爆炸");  
            }  
        }, 2, TimeUnit.SECONDS);  
    }  
      
    /** 
     * 5秒后第一次执行线程,之后每隔2秒执行一次 
     * 也就是5秒后打印第一次爆炸,之后每隔2秒打印一次爆炸 
     */  
    public static void method2(){  
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);  
        pool.scheduleAtFixedRate(new Runnable() {  
            @Override  
            public void run() {  
                System.out.println("爆炸");  
            }  
        }, 5, 2, TimeUnit.SECONDS);  
    }  
}  

  method1执行结果:(只执行一次)

技术分享图片

 

  method2执行结果:

技术分享图片

 

四、单线程池(只有一个线程的线程池)

 使用  ExecutorService pool=Executors.newSingleThreadExecutor();  创建一个单线程池

  代码:

package demo;

import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
/** 
 * 只有一个线程工作的线程池 
 * 始终保持池中有一个线程,当一个线程死了会立即重新创建一个线程 
 */  
public class SingleThreadExecutorTest {  
    public static void main(String[] args) {  
        ExecutorService pool=Executors.newSingleThreadExecutor();  
        for(int i=0;i<3;i++){  
            final int task=i;  
            pool.execute(new Runnable() {  
                @Override  
                public void run() {  
                    try {  
                        Thread.sleep(20);  
                    } catch (InterruptedException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                    for(int j=0;j<3;j++){  
                        System.out.println(Thread.currentThread().getName()+"正在进行第"+(task+1)+"个任务,第"+(j+1)+"次循环");  
                    }  
                }  
            });  
        }  
    }  
}  

  执行结果:

技术分享图片

 

java线程池四种简单案例

原文:https://www.cnblogs.com/lw-20171224/p/13826158.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!