漫画身份转换,漫画身份互换

  漫画身份转换,漫画身份互换

  什么是进程和线程

  有一定基础的伙伴一定要懂流程和线程。

  流程是怎样的?

  简而言之,进程就是一个APP应用的启动实例。比如你运行游戏,打开软件,进程就会打开。

  具有进程代码和开放的文件资源、数据资源和独立的内存空间。

  什么是线程?

  线程依赖于进程,是程序的实际执行者。该进程可以包含至少一个主线程或多个子线程。

  线程有自己的堆栈空间。

  有人总结得好:

  对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。

  进程和线程由操作系统管理。

  Java线程有五种状态:

  初始化

  可运行

  运行中

  阻塞

  销毁

  五种状态之间的转换关系如下。

  然而,谁来实现线程在不同状态之间的转换呢?是JVM吗?

  不可以。JVM需要使用操作系统内核中的线程控制块(TCB)模块来改变线程的状态。这个过程需要CPU资源。

  进程和线程的痛点

  

  线程是如何协同工作的?

  最典型的例子是生产者/消费者模式

  一些生产者线程将数据写入队列,而一些消费者线程从队列中消费数据。

  如何用java语言实现生产者/消费者模型?

  让我们看看代码:

  publicclassproducerconsumertest {

  publicstaticvoidmain(string args[]){

  finalqueueintegersharedqueue=新建链表(;

  线程生产者=新生产者(共享队列;

  线程消费者=新消费者(共享队列;

  producer . start(;

  consumer . start(;

  }

  }

  类扩展线程{

  private inalintmax _ queue _ size=5;

  最终队列共享队列;

  公共产品(队列共享队列){

  超级(;

  this . shared queue=shared queue;

  }

  @覆盖

  公共无效运行(}

  for(intI=0;i 100I ) {

  同步(共享队列){

  while(共享队列大小(=最大队列大小) )

  System.out.println(队列已满,等待消耗);

  尝试{

  shared queue . wait(;

  } catch(互联))

  E.打印堆栈跟踪(;

  }

  }

  sharedQueu

  e .添加;

  system . out . println( for production: I );

  shared queue . notify();

  }

  }

  }

  }

  类使用者扩展线程{ private final QueuesharedQueue

  公共使用者(队列共享队列){

  super();

  this . shared queue=shared queue;

  }

  @覆盖

  公共无效运行(){

  while(true) {

  同步(共享队列){

  while (sharedQueue.size()==0) {

  尝试{

  System.out.println(队列为空,等待生产);

  shared queue . wait();

  } catch (InterruptedException e) {

  e . printstacktrace();

  }

  }

  int number=shared queue . poll();

  system . out . println( for consume: number );

  shared queue . notify();

  }

  }

  }

  }

  该代码执行以下操作:

  1.定义了生产者类和消费者类。

  2.生产者类循环100次,将数据插入同步队列。

  3.使用者循环监视同步队列,并在队列中有数据时提取数据。

  4.如果队列已满(最多5个元素),则生成器被阻塞。

  5.如果队列为空,消费者将被阻止。

  上面的代码正确地实现了生产者/消费者模型,但是它不是一个高性能的实现。为什么性能不高?原因如下:

  1.它涉及到同步锁。

  2.它包括线程阻塞状态和可运行状态之间的切换。

  3.它涉及到线程上下文的切换。

  上面提到的任何一点都是非常性能密集型的操作。

  什么是协程

  正如一个进程可以有多个线程一样,一个线程也可以有多个协程。

  最重要的是,协程不是由操作系统内核管理,而是完全由程序控制(即在用户态执行)。

  这样做的好处是性能大大提升,不会像线程切换一样消耗资源。

  既然协同过程这么好,怎么用?

  由于Java的原生语法没有实现协同学(有些开源框架实现了协同学,但很少使用),我们来看看协同学在python中的实现案例,同样以生产者-消费者模型为例:

  这段代码非常简单,即使是没用过python的朋友也应该能基本看懂。

  该代码创建了一个名为consumer的协程,它在主线程中产生数据,并在协程中消费数据。

  协程,英文Coroutines,是一种比线程更加轻量级的存在。是python中的语法。当协程执行到yield关键字时,它将在那一行暂停。当主线程调用send方法发送数据时,协程将接收数据并继续执行。

  然而,yield停止进程和线程阻塞之间有一个基本的区别。进程的暂停完全由程序控制,线程的阻塞状态由操作系统内核切换。

  因此,yield

  协程的开销远远小于线程的开销。

  协同学应用过哪些编程语言?举几个栗子吧:

  协程的应用

  Lua从5.0版本开始使用协程,通过扩展库协程来实现。

  Lua语言

  就像刚才写的代码例子一样,python可以通过yield/send实现协同。在python 3.5之后,async/await成为了更好的选择。

  Python语言

  Go语言对于协程的实现非常强大和简洁,它可以轻松地创建数百个协程并并发执行。

  Go语言

  

  如上所述,Java语言没有协同学的原生支持,但是一些开源框架模拟了协同学的功能。感兴趣的伙伴可以看一下源代码Java语言:

  https://github.com/kilim/kilim

  转载于:https://www.cnblogs.com/feixiablog/p/9203334.html

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: