java线程的原理和实现方式


本篇内容介绍了“java线程的原理和实现方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们都知道,实现多线程的方式是继承Thread类和实现Runable接口,那么除了java中不允许多继承的这个特性,他们之间还有什么区别呢?我们看下面这个例子:通过观察console信息我们可以看到,继承Thread类,无法共享对象资源,而实现Runable则可以;这让我们可以针对不同的业务情况作出不同的选择。
Thread.State枚举中定义了线程的六种状态关于线程状态流转,看下面这幅图;左边是正常状态流转,右边是存在block和waiting的情况:
网上有些文章说线程还分为ready和running状态,这里需要注意的是,这两种执行状态都属于Runable状态;ready和running状态其实是描述VM/OS是否线程分配CPU资源,JVM并不能决定这一事情。当然运行中的线程通过调用yield方法是可以将running状态的线程切换到ready状态,但这一过程是OS层面的事情而非JVM层面。在实现多线程的过程中,我们需要用到相关方法来进行线程状态的切换,已达到不同的目的。Thread类的相关方法Object类的相关方法
Obj类主要有wait()和notify()、notifyAll()三个方法来控制多线程读共享数据的访问;注意这三个方法不是Thread类的,故只能在同步代码块中才会产生效果。我们在系统中直接new线程是可以实现多线程,但是存在以下弊端:线程不能重用,过多的线程创建和销毁会降低系统性能不能控制线程并 香港云主机发数量不能指定线程的定时执行等ThreadPoolExecutor让我们可以自定义线程池,它有三个构造函数,它的参数含义如下 :
任务队列workQueue指明了当核心线程数达到最大时,任务的排队策略;有三种类型:拒绝策略在使用有界队列的前提下,如果工作队列已满,我们需要设定拒绝策略以上拒绝策略中,除了CallerRunsPolicy其他的都好理解,下面我们使用CallerRunsPolicy策略来和DiscardPolicy进行一个比对:

我们定义了最大线程是3个,排队两个,线程睡眠0.5s以达到效果;使用DiscardPolicy策略我们可以看到10个任务丢弃了5个。
但是CallerRunsPolicy策略会让主线程来执行任务,同时将主线程阻塞,已达到延缓提交任务的效果;当主线程执行完毕后,线程池内任务也执行完毕了,这时线程池会继续接受后续任务。我们可以通过submit、execute方法提交任务给线程池执行,其中submit方法有三个重载,他们有以下区别CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+1IO密集型任务,参考值可以设置为2*NCPU上面ThreadExecutorPool提供给我们手动实现线程池的方式,同时J.U.C包下面提供了线程池Executors类,可以让我们方便的创建线程池。
Executors提供了5种线程池的实现方式,以针对不同的业务场景:
从上图中我们可以看到,除了newWorkStealingPool以外,其他的线程池都只是通过ThreadExecutorPool构造函数,传递不同的参数而实现不同的效果,这也是本篇博客为什么先介绍ThreadExecutorPool的原因;虽然这几种线程池区别已经一目了然,我们还是列举一下它们的特点:ForkJoinPool
ForkJoinPool适用于大型任务,其核心是Fork和Join;Fork可以将一个大任务拆分为多个小的任务,Join会将多个小的任务的结果汇总达到最终运行效果。举个例子:假设一个线程池中并发数控制在两个,但是每个任务都要运行1分钟;假设我们当前服务器有4个CPU,两个在处理任务,其他的则为空闲状态,这时剩下的两个空闲CPU资源是浪费的。
试想一下:如果们能使剩下的两个空闲的CPU也能利用起来处理上面两个任务,任务运行肯定会加快,这就是ForkJoinPool的设计出发点。多数情况下,不推荐使用Executors,而推荐手动创建ThreadExecutorPool,因为Executors的五种实现方式有一下缺点:要么不能控制并发:资源耗尽、OOM要么不能设置等待队列大小:OOM不能指定拒绝策略“java线程的原理和实现方式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注开发云网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 电脑中的无线网卡驱动如何安装

小编给大家分享一下电脑中的无线网卡驱动如何安装,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.点击桌面左下方“主菜单”,点击“控制面板”。2.进入控制面板后点击“管理工具”。3.点击“计算机管理”。4.点击“设备管理”,点击“网络适配器”。…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/30 12:45
Next 07/30 12:45

相关推荐