本文主要是介绍并发、并行傻傻分不清楚?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天,我们正在解决一个问题:
同时的,同时的愚蠢的困惑?线程在其生命周期中经历了什么?
知识给你解答生活中所有困难的问题。
=concurrent和parallel==
并发是指在一定时间内,多任务交替处理的能力。并行性是指同时处理多个任务的能力。
案例:当一个商场的销售员需要面对许多顾客时,有些顾客要求价格,有些顾客要求质量。这时,业务员需要不断地回答客户,不断地改变话题,记住前面的话题,以便他回答。这种方式可以理解为并发的。如果有许多销售人员对应多个客户,那么许多销售人员可以同时回答客户的问题。这条路是平行的。
=thread lifetime=
线程是CPU调度和分配的基本单元。线程可以有自己的操作堆栈、程序计数器、本地变量表和其他资源。它与同一进程中的其他线程共享进程的所有资源。
创建线程有三种方法。首先从线程类继承,如下所示:
第二种方式是实现Runnable接口,如下所示:
public class HandlerThread implements Runnable {@Overridepublic void run() {}}
建议使用第二种方法,因为继承线程类不符合Richter的替换原则。实现可运行的接口可以使编程更加灵活,公开的细节更少。
public class Demo implements Callable<String> {public static void main(String[] args) throws ExecutionException, InterruptedException {Callable<String> callable=new Demo();FutureTask<String> futureTask=new FutureTask<>(callable);new Thread(futureTask).start();System.out.println(futureTask.get());}@Overridepublic String call() throws Exception {return "demo";}
}
第三种方法使用可调用接口,如下所示:
可调用接口和未来接口的区别在于:
- callable指定call(),runnable指定run()。
- 可调用任务可以在执行后返回值,而可运行任务不能返回值。
- 调用()方法可以引发异常,而run()方法不能引发异常。
- 运行可调用任务将生成一个未来对象,该对象表示异步计算的结果。它提供了一种检查计算是否已完成、等待计算完成以及检索计算结果的方法。通过未来的对象,我们可以了解任务的性能,取消任务的执行,并获得任务执行的结果。
- Callable是一个类似于runnable的接口。实现可调用接口的类和实现可运行的类是可以由其他线程执行的任务。
线程有五个生命周期,如下所示:
线程的生命周期状态为:新状态、就绪状态、运行状态、阻塞状态和终止状态。
- 新建,即新状态,是指创建线程而不启动线程的状态。
- runnable,ready state,是在调用start()方法之后运行之前的状态。不能多次调用Start(),否则将引发IllegalStateException。
- running,run state是执行run()时线程的状态。由于某些因素(如时间、异常、锁、调度等),线程可能会开始运行。
- 阻塞、阻塞状态,进入此状态的情况包括:同步阻塞(其他线程占用的锁)、活动阻塞(调用线程的某些方法,主动授予CPU执行权限,如sleep()、join()等)和等待阻塞(执行wait()方法)。
- Dead,终止状态,是运行()执行因异常而结束或退出后的状态。
我在这里说的是创建线程的形式。创建线程的本质是实际创建一个可运行的对象(您可以看到相关的源代码,线程实现可运行的接口,并且只有目标分配是在内部完成的)。在run方法中,仍然执行目标run方法)。线程的start方法是真正的线程创建方法(在内部调用native create square)。为什么不建议继承线程,因为它向外部世界公开了更多的细节?非常感谢你的想法。
这篇关于并发、并行傻傻分不清楚?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!