java 线程进程

2019-04-28  本文已影响0人  程南swimming

参考:https://blog.csdn.net/evankaka/article/details/44153709

作为一个非科班出身的互联网小白,在读netty的时候接触到了并发、线程等概念,读完只是囫囵吞枣了几分。承蒙正好有高手跟稍微讲了下:多个请求同时发来,线程并不会阻塞去接受这个请求,而是会等请求信息发送完毕后,再启用线程处理;进而扩展了下线程池的概念,核心线程数量,最大线程数量等。听完后顿时觉得自己之前的学习方法有问题,学习一个新的东西,应该首先要知道的是为什么要这么做,这么做的好处,接着才是具体如何实现,如果盲目的学习代码细节或者概念上的东西,只会是似懂非懂,绝不会有深入的理解。想要以后读这些知识点的时候不再似懂非懂,我决心要把java编程思想捡起来好好看看,把基础知识补起来。首先,就看进程和线程的概念吧!

首先,计算机基本结构:cpu,存储器(主存,也就是内存,当然还有硬盘),输入设备,输出设备,主存的读取速度高于硬盘。

那么为什么会有进程的概念,这里提两点  1:cpu的处理速度非常快,为了充分利用cpu,可以让他同时处理多个进程,比如说在电脑上同时打开音乐播放器和视频播放器   2:进程是cpu资源分配的最小单位,在给进程分配内存地址空间的时候,用了虚拟内存地址的概念,这样是为了有序的管理真实的物理地址。

线程,则是对cpu超快处理速度的进一步利用,在cpu处理某个进程的时候,他可以进一步被用来处理该进程里面的多个线程。线程是cpu调度的最小单位,在单核cpu中,一个单核用来处理一个线程。同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC)

以上说的都很抽象:以我们自己写的一段System.out.println("Hello world")程序为例吧

1:程序启动运行main时候,java虚拟机启动一个进程;因为每当使用java命令执行一个类的时候,实际上都会启动一个jvm,每一个jvm实际在就是在操作系统中启动了一个进程。JVM 通过类加载器加载 class 文件里的字节码后,会通过解释器解释成汇编指令,最终再转译成 CPU 可以识别的机器指令.

2:主线程main在main()调用时候被创建,在java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源;在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。在 JVM 中所有的线程共享堆内存和方法区,而每个线程有自己独立的 Java 方法栈.当调用一个方法的时候, Java 虚拟机会在当前线程对应的方法栈中压入一个栈帧

3:java创建对象在内存里的空间位置:主类型是在堆栈,一般对象是在内存堆

4:下面是线程的5个状态,着重介绍下锁的概念;由于线程共享进程里面的资源、函数等,为了防止混乱,有时候一个资源只能被一个线程访问

4.1 synchronized锁:指定加锁对象:对给定对象加锁,进入同步代码前要获取给定对象的锁。

直接作用于实例方法:相当于给当前实例加锁,进入同步代码块前要获得当前实例的锁。

直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获取当前类的锁。

4.2 当在一个对象实例上调用了wait()方法后,当前线程就会在这个对象上等待。直到其他线程调用了这个对象的notify()方法或者notifyAll()方法

调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)

***在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。

例:锁住一个方法: public synchronized void test()  

***使用Object的wait/notify

在线程中调用 wait() 方法,将阻塞当前线程,直至等到其他线程调用了调用 notify() 方法或 notifyAll() 方法进行通知之后,当前线程才能从wait()方法出返回,继续执行下面的操作

上一篇下一篇

猜你喜欢

热点阅读