博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发、并行傻傻分不清楚?
阅读量:4031 次
发布时间:2019-05-24

本文共 1818 字,大约阅读时间需要 6 分钟。

今天,我们正在解决一个问题:

同时的,同时的愚蠢的困惑?线程在其生命周期中经历了什么?

知识给你解答生活中所有困难的问题。

=concurrent和parallel==

并发是指在一定时间内,多任务交替处理的能力。并行性是指同时处理多个任务的能力。

案例:当一个商场的销售员需要面对许多顾客时,有些顾客要求价格,有些顾客要求质量。这时,业务员需要不断地回答客户,不断地改变话题,记住前面的话题,以便他回答。这种方式可以理解为并发的。如果有许多销售人员对应多个客户,那么许多销售人员可以同时回答客户的问题。这条路是平行的。

=thread lifetime=

线程是CPU调度和分配的基本单元。线程可以有自己的操作堆栈、程序计数器、本地变量表和其他资源。它与同一进程中的其他线程共享进程的所有资源。

创建线程有三种方法。首先从线程类继承,如下所示:

第二种方式是实现Runnable接口,如下所示:

public class HandlerThread implements Runnable {    @Override    public void run() {    }}

 建议使用第二种方法,因为继承线程类不符合Richter的替换原则。实现可运行的接口可以使编程更加灵活,公开的细节更少。

public class Demo implements Callable
{ public static void main(String[] args) throws ExecutionException, InterruptedException { Callable
callable=new Demo(); FutureTask
futureTask=new FutureTask<>(callable); new Thread(futureTask).start(); System.out.println(futureTask.get()); } @Override public String call() throws Exception { return "demo"; }}

第三种方法使用可调用接口,如下所示:

可调用接口和未来接口的区别在于:

  1. callable指定call(),runnable指定run()。
  2. 可调用任务可以在执行后返回值,而可运行任务不能返回值。
  3. 调用()方法可以引发异常,而run()方法不能引发异常。
  4. 运行可调用任务将生成一个未来对象,该对象表示异步计算的结果。它提供了一种检查计算是否已完成、等待计算完成以及检索计算结果的方法。通过未来的对象,我们可以了解任务的性能,取消任务的执行,并获得任务执行的结果。
  5. Callable是一个类似于runnable的接口。实现可调用接口的类和实现可运行的类是可以由其他线程执行的任务。

线程有五个生命周期,如下所示:

线程五种状态.jpg

线程的生命周期状态为:新状态、就绪状态、运行状态、阻塞状态和终止状态。

  • 新建,即新状态,是指创建线程而不启动线程的状态。
  • runnable,ready state,是在调用start()方法之后运行之前的状态。不能多次调用Start(),否则将引发IllegalStateException。
  • running,run state是执行run()时线程的状态。由于某些因素(如时间、异常、锁、调度等),线程可能会开始运行。
  • 阻塞、阻塞状态,进入此状态的情况包括:同步阻塞(其他线程占用的锁)、活动阻塞(调用线程的某些方法,主动授予CPU执行权限,如sleep()、join()等)和等待阻塞(执行wait()方法)。
  • Dead,终止状态,是运行()执行因异常而结束或退出后的状态。

我在这里说的是创建线程的形式。创建线程的本质是实际创建一个可运行的对象(您可以看到相关的源代码,线程实现可运行的接口,并且只有目标分配是在内部完成的)。在run方法中,仍然执行目标run方法)。线程的start方法是真正的线程创建方法(在内部调用native create square)。为什么不建议继承线程,因为它向外部世界公开了更多的细节?非常感谢你的想法。

转载地址:http://mzgbi.baihongyu.com/

你可能感兴趣的文章
用防火墙自动拦截攻击IP
查看>>
补充自动屏蔽攻击ip
查看>>
谷歌走了
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
SQL 多表联合查询
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
在Dll中调用自身的位图资源
查看>>
IP校验和详解
查看>>
C++中使用Mongo执行count和distinct运算
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
C++获取文件大小常用技巧分享
查看>>