Java中如何使用线程池-创新互联

什么是线程池 ?

Ta是一种标准的资源池模式

在龙游等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、成都网站制作 网站设计制作按需定制制作,公司网站建设,企业网站建设,品牌网站制作,全网整合营销推广,成都外贸网站建设,龙游网站建设费用合理。
  • 将资源的创建和销毁都委托给资源池完成 用户只需要关注取得资源之后自己的核心操作

  • 提前预留活跃资源 在用户需要的时候 能够第一时间满足用户对资源的需求 从而让用户感受很好

为什么要使用线程池 ?

假如一个线程的完整执行时间 T 则T由三部分时间构成
T = t1 + t2 + t3
t1 : 在操作系统当中创建一个线程所消耗的时间
t2 : 执行线程核心逻辑的时间 = run()
t3 : 在操作系统当中销毁一个线程所消耗的时间

如果run()当中的操作非常简练 则t2所占T的比例就会很小
此时创建和销毁所带来的时间开销就会很大 为什么不引入可重用的资源池~

创建线程池的几种方式
  • newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程

  • newFixedThreadPool 创建一个定长线程池,可控制线程大并发数,超出的线程会在队列中等待

  • newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行

  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会唯一的工作线程来执行任务

如何使用线程池 ?
import java.util.concurrent.*;//JUC
import java.util.*;
public class TestThreadPool{public static void main(String[] args)throws Exception{//白话版:端茶倒水的服务员 es = 职业介绍所.新建端茶倒水的服务员手持3杯水~
		//学术版:执行器服务的对象 es = 执行器的工具类.新建一个修复后可以重用的线程池 当中预留3个活跃线程
		ExecutorService es = Executors.newFixedThreadPool(2);//固定个数的全职服务员
						   //Executors.newCachedThreadPool(); //60S 一分钟 不固定个数的兼职服务员
						   //Executors.newSingleThreadExecutor();//形成程序当中的"独木桥"~

		ThreadOne t1 = new ThreadOne();//新生
		//白话版:找服务员要水喝 而不要自己去接水
		//学术版:将线程任务t1 提交给执行器服务
		es.submit(t1);

		ThreadTwo t2 = new ThreadTwo();
		es.submit(t2);

		ThreadThree t3 = new ThreadThree();
		Futuref = es.submit(t3);
		//我们可以根据自己的需求是否需要未来当中的数据来决定是否调用get()

		System.out.println("这里是不需要返回值的操作 例如喝杯水 讲讲课 顺道等着勋勋回来~");

		//get()之前是可以利用t3还在执行的时候去做其它处理的~
		String returnValue = f.get();//阻塞之后的操作 等待未来来到 等待勋勋买烟回来

		System.out.println(returnValue + " 抽烟的操作 必须在买烟返回之后~");

		//关闭执行器服务 = 让服务员下班
		Listbthld = es.shutdownNow();//es.shutdown();
	}
}

class ThreadThree implements Callable{@Override
	public String call()throws Exception{for(int i = 0;i<200;i++){	System.out.println("我是创建线程的第三种方式 3rd way ");
		}
		return "ETOAK VIVA";
	}
}
class ThreadTwo implements Runnable{@Override
	public void run(){for(int i = 0;i<200;i++){	System.out.println("我是创建线程的第二种方式 2nd way ");
		}
	}
}
class ThreadOne extends Thread{@Override
	public void run(){for(int i = 0;i<200;i++){	System.out.println("我是创建线程的第一种方式 1st way ");
		}
	}
}

shutdown()与shutdownNow()的区别

shutdown() : 不再接受新任务的提交 但是已经提交的所有任务都要执行完
shutdownNow() : 不再接受新任务的提交 已经开始执行的能够执行完
但是还没开始执行的 将直接退回给我们~

关于Callable接口实现线程

它弥补了原本Runnable接口当中run()的两大不足

  • run()被定义为void方法 执行结束之后 线程无法返回数据

  • run()没有任何throws声明 所以 逼迫程序员 线程体当中try catch

为什么Callable接口的返回值为Future

如果将Callable接口的返回值对象设计为String那么调用Callable接口实现的线程的时必须等待Callable接口的Call()执行结束

使用Future对象的话我们只有调用Future对象的get()方法才会阻塞

我们可以根据自己的需求是否需要未来当中的数据来决定是否调用get()

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

网站标题:Java中如何使用线程池-创新互联
分享地址:https://www.cdcxhl.com/article6/jdsig.html

成都网站建设公司_创新互联,为您提供网页设计公司网站内链静态网站建站公司网站收录服务器托管

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

h5响应式网站建设