当前位置: 首页 > news >正文

拉萨网站建设公司网络热词2022

拉萨网站建设公司,网络热词2022,两学一做教育纪实评价系统网站,哪些公司的网站做的漂亮前言 特点分析 线程池ThreadPool 销毁线程池 Executor类 ​​​​​​​ ​​​​​​​ ​​​​​​​ Callable接口 线程池使用 ​​​​​​​…

前言                                                特点分析

线程池ThreadPool                         销毁线程池

 Executor类                ​​​​​​​        ​​​​​​​        ​​​​​​​    Callable接口

线程池使用                 ​​​​​​​        ​​​​​​​        ​​​​​​​    Callable启动线程

 ​​​​​​​ExecutorService接口的方法                                               


前言

在上一篇Java—实现多线程程序 | 入门的文章中,我们初步了解Thread类的用法

第一次书写多线程程序,算是完成一个Java学习的里程碑

接下来我们继续进入多线程的学习

线程池ThreadPool

线程池:线程的缓冲池,目的就是提高效率。 new Thread().start(),线程是内存中的一个独立的方法栈区,JVM没有能力开辟内存空间和OS交互

而线程会频繁地与OS交互浪费资源,线程池就是开辟一个空间,专门用于存储线程对象,可以理解为集合,当线程需要时,就从池子里调用出来,使用结束再丢回线程池,保证了线程不会“死掉”,反复利用,达到高效

线程池的目的是为了提高线程的利用率,减少创建和销毁线程的开销,降低系统资源的消耗,提高系统的稳定性和可靠性。在高并发的环境中,线程池可以有效地控制并发数量,防止线程因互相竞争而产生死锁、饥饿或者系统资源耗尽等问题。

tips:后面学到的数据库连接池也是类似的效果

jdk5开始内置线程池


 Executor类

使用静态方法创建线程池

public static newFixedThreadPool(int nThreads)

创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。

int nThreads是传入线程的数量

 方法的返回值是ExecutorService接口的实现类,管理池子里面的线程


线程池使用 

创建线程池, 线程数量是两个

线程数量虽然可以自行定义,但最好不要过多,浪费资源

ExecutorService es = Executors.newFixedThreadPool(2);

创建线程对象,线程池管理对象Service,调用方法submit提交线程任务,当然,前提是得先写一个Runnable

public class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("线程开始运行");}
}

ExecutorService接口的方法

submit(Runnable r)提交线程执行的任务

public class ThreadTest {public static void main(String[] args) {ExecutorService es = Executors.newFixedThreadPool(2);Runnable runnable = new MyRunnable();es.submit(runnable);}
}

特点分析

这一次运行代码不知道你们是否发现了不同之处 

以往的代码运行时,程序会自动结束不再运行,而这次你可以看到,程序一直在后台保活,直到我们手动关闭。这就是上文所说线程池的作用:用则拿,不用则还,线程不死

使用了线程池的程序

这里的中文乱码比较懒,没有调整,将就着看哈哈,如果你也遇到了中文乱码的问题而没有找到合适的方法,可以看我的另一篇文章,我想它会对你有所帮助⬇⬇⬇解决IntelliJ IDEA 代码运行时中文出现乱码

 同时,为了更直观地看到线程的执行,我们还可以查看一下线程的名字,然后把runnab对象多submit几次

System.out.println(Thread.currentThread().getName()+"线程开始运行");
public class ThreadTest {public static void main(String[] args) {ExecutorService es = Executors.newFixedThreadPool(2);Runnable runnable = new MyRunnable();es.submit(runnable);es.submit(runnable);es.submit(runnable);es.submit(runnable);es.submit(runnable);}
}
查看使用中的线程名

销毁线程池

当我们不需要使用线程池时,总得让它结束,所以我们就可以把它销毁,自行结束 

es.shutdown();

 此时我们再运行程序,当所有线程不再使用时,运行到这行代码,线程池就被销毁了


Callable接口

Callable也能像Runnable一样建线程,但和Runnable接口有区别

Callable接口有返回值,且Callablecall方法可以抛出异常(Runnable没有)

 Callable的抽象方法只有一个:call

我们尝试使用一下相关代码

public class MyCall implements Callable<V> {public V call() throws Exception {return null;}
}

 注意此处的<V>为泛型,即你需要返回数据的类型,此处我们可以改成String,然后return字符串

public class MyCall implements Callable<String> {public String call() throws Exception {return "返回字符串";}
}

Callable启动线程

线程调用重写方法call,需要使用到线程池,我们依旧可以使用submit,把submit(Runnable r)改为submit(Callable c)提交线程执行的任务,但当我们运行时没有任何输出结果

这时候我们就要使用Future接口,Future submit()方法提交线程任务后,方法有个返回值Future接口类型,而它则可以获取到线程执行后返回的结果

public class CallText {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建线程池ExecutorService es = Executors.newFixedThreadPool(2);//创建线程MyCall myCall = new MyCall();//提交线程任务,使用Callable接口实现类Future<String> future = es.submit(myCall);//返回接口类型Future//接口的方法get,获取线程的返回值String str = future.get();System.out.println("str = "+str);}
}
运行结果

http://www.dt0577.cn/news/16013.html

相关文章:

  • 个人网站模板大全seo顾问能赚钱吗
  • 网站域名免费注册苏州seo网站系统
  • 郑州网站建设 推广百度一下1688
  • 做搜狗手机网站优详细的营销推广方案
  • 网站百度百科怎么做手机网站百度关键词排名
  • 苏州网站定制公司怎么从网上找国外客户
  • 旅游网站排名前十深圳开发公司网站建设
  • 自己的电脑做网站空间视屏新媒体运营怎么自学
  • 个性定制网站2021国内最好用免费建站系统
  • 使用阿里云做镜像网站网站新域名查询
  • 网站设计赏析竞价推广培训课程
  • 重庆微网站制作网络市场调研
  • 网站开发属于什么职位类别现在做百度快速收录的方法
  • 心理咨询网站域名查询seo
  • 网站建设技术的发展推广网站有哪些
  • 网站建设增值税做网站的流程与步骤
  • 青岛市黄岛区城市建设局网站湖北seo公司
  • 做公众号必了解的网站百度广告上的商家可靠吗
  • 企业网站备案网址nba赛程排名
  • 广告品牌设计机构网站织梦模板青岛seo公司
  • 可以做任务的网站怎样在百度上宣传自己的产品
  • 网站投注建设快速排名精灵
  • 网站建设需要的软件广东省疫情最新
  • 8网站建设做网站疫情最新消息今天
  • 饮料招商网站大全百度云资源搜索
  • 如何查询网站建站时间seo优化主要做什么
  • wordpress 标签输出做seo排名好的公司
  • 山东天成水利建设 网站武汉整站优化
  • 哪些网站可以免费做产品推广湖北网络营销网站
  • 大型门户网站程序seo变现培训