线程的基本概念、线程基本状态以及状态之间的关系

线程的第一个概念:线程是指程序执行过程中能够执行程序代码的执行单元。
Java中的线程有四种状态:运行、就绪、挂起和终止。
可以对多个执行序列进行编程以同时执行。
线程是指开发中至少有一个线程的线程,即执行主程序的线程。
如果只是一个CPU,怎么能同时运行多个程序呢?这部分是同一办公室中互联网的宏观表面,并且只有一个与外部网络电缆的连接,事实上,该网络的电缆传输A模式的数据和B模式的数据。
所有互联网表面都在一起。
状态:就绪、运行、同步阻塞、等待和睡眠、挂起、完成。
这些图是内部同步的。
调用线程start方法后,线程进入就绪状态。
线程调度系统将就绪状态的线程转变为运行状态。
这种情况下,可以调用delay方法切换到挂起状态。
我记得我是在那天的夕阳下跑步的。
12:57

什么是多线程

简单地说,WINROM有一个执行它的主线程。
当某个特定方法在运行过程中被中断时,程序就会挂起(挂起)。
可以另外开一个线程来执行这个方法(被中断的方法)。
有一个悬而未决的例子,你正在玩星际争霸,你的主机正在建造一个农民,直到你完成挖矿之后你才能开始挖矿。
我想同时做一个农民和矿场,这就是多线程,哈哈

多线程实现的四种方式

实现多线程的四种方式:Thread裸线程、运行服务、ForkJoin框架和Actor模式。

1裸线程

线程是最基本的并发单位。
Java线程本质上与操作系统线程相关,每个线程对象对应一个底层计算机线程。
每个线程都有自己的堆栈空间,该空间占用JVM进程空间的一定部分。

线程接口非常简单。
没有现成的API可以结束线程,你必须自己实现。

优点是非常接近并发计算的操作系统/硬件模型,而且这个模型非常简单。
多个线程通过共享内存进行管理和通信。
最大的缺点是开发者很容易过于关注线程数。

线程是昂贵的对象,它们的创建需要大量的内存和时间。
这是一个矛盾。
如果线程太少,就不能得到很好的和谐,如果线程太多,则很可能会出现内存问题,调度也会变得更加复杂。
如果你需要一个快速简单的解决方案,你绝对可以使用这个方法,不要犹豫。

2执行器服务

另一种选择是使用API来管理线程池。
幸运的是,JVM为我们提供了这样一个功能,这就是执行器接口。
它隐藏了如何处理Runnable的细节。

它只是说:“开发人员!把任务交给我,我来处理!”我们将使用newFixedThreadPool,它创建一个默认的线程数,并且不允许线程数超过这个默认值。

这意味着如果所有线程都被使用,那么提交的命令将会被放入一个队列中等待,当然这是由执行器管理的。
最重要的是,ExecutorService管理执行器生命周期,CompletionService抽象更多细节并充当已完成任务的队列。

如果您需要精确控制程序创建的线程数量及其精确行为,那么执行器和执行器服务将是正确的解决方案。
例如,需要仔细考虑的一个重要问题是,当所有线程都忙于做其他事情时,需要什么策略?

增加主题数量还是限制数量?将任务排队并等待?如果队列满了怎么办?无限制地增加队列大小?

感谢JDK,已经有很多配置项可以回答这些问题并且有直观的名称,例如上面的Executors.newFixedThreadPool(4)。

主题和服务的生命周期也可以通过选项进行配置,以便资源在适当的时间终止。
唯一的问题是配置选项对于初学者来说可能更简单、更直观。
然而,当谈到并发编程时,你很难发现它更简单。
总之,对于大型系统,使用可执行文件是最合适的。

3ForkJoin框架

通过并行流并使用ForkJoinPool(FJP),Java8中添加了并行流。
从此,我们在.平行线。
它与lambda一起构成了并发计算的强大工具。

如果您打算使用此方法,有几种需要注意的事项。
首先你需要了解函数式编程的一些概念,这其实更有优势。
其次,很难知道并行流是否使用多个线程。
这取决于流程的具体实现。
如果不检查流的数据源,就无法确定它的作用。

此外,您应该记住,默认情况下并行性是通过ForkJoinPool.commonPool实现的。
该全局池由JVM管理,并由JVM进程中的所有线程共享。
这样就简化了配置项,让你不用担心。

ForkJoin是一个优秀的框架,当你需要编写涉及并行处理的小程序时,它是首选。
它最大的缺点是您必须预见可能出现的并发症。
如果没有对JVM整体的深入了解,这是很难做到的。
这只能来自经验。

4Actor模型

JDK中没有Actor实现,因此您必须引用一些库Actor实现。

简而言之,在演员模型中,你将一切都视为演员。
Actor是一个计算实体,就像上面第一个示例中的线程一样,它可以从其他Actor接收消息,因为一切都是Actor。

在回复消息时,它可以向其他参与者发送消息,或者创建新的参与者并与他们交互,或者只是改变其内部状态。
非常简单,但却是一个非常强大的概念。
生命周期和消息由您的框架管理,您只需要指定计算单位是什么。

此外,Actor模型强调避免全局状态,这会带来很多便利。
您可以应用免费重试、更简单的分布式系统模型、容错等监控策略。
AkkaActors具有Java接口,是最流行的JVMActor库之一。

事实上,它也有一个Scala接口,并且是实际的默认Scalaactor库。
里面用Scala来实现actor。
很多JVM语言都实现了actor,比如Future。
这些表明Actor模型被广泛接受,并被认为是该语言的非常有价值的补充。

Akkaactor在内部使用ForkJoin框架来处理其工作。
Actor模式的力量来自于Props对象接口,通过它我们可以定义特定的选择加入模式、自定义电子邮件地址等。
对于演员来说。
由此产生的系统也是可配置的,并且只包含几个移动部件。

这是一个好兆头!使用Actor模式的一个缺点是它要求您避免全局状态,因此您必须仔细设计应用程序,这可能会使项目迁移变得复杂。
同时,它也有很多优点,所以学习一些新的范式和使用新的库是完全值得的。

可以看出Scala的并发线程非常简单,你不需要处理线程、锁、线程间通信、线程间协作等问题。
它总结了一切。