前言:
目前姐妹们对“java的多”大概比较关注,看官们都想要学习一些“java的多”的相关知识。那么小编在网上汇集了一些对于“java的多””的相关知识,希望各位老铁们能喜欢,兄弟们一起来了解一下吧!创作不易,关注、点赞,分享,转发,评论,收藏
利用对象,可将一个程序分割成相互独立的区域。
“进程”是指一种“自包容”的运行程序,有自己的地址空间。
“多任务”操作系统能同时运行多个进程(程序)——但实际是由于CPU 分时机制的作用,使每个进程都能 循环获得自己的CPU 时间片。
Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等
进程与线程的基础区别
1、进程是资源分配的最小单位,线程是程序执行的最小单位
2、进程有自己的独立地址空间,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段。
线程是共享进程中的数据的,使用相同的地址空间。
3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,
进程之间的通信需要以通信的方式(IPC)进行。
4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
从线程继承分析
创建一个线程,最简单的方法就是从Thread 类继承。Thread 最重要的方法是run()。
下面这个例子可创建任意数量的线程。
一个线程可以有四种状态新(New):线程对象已经创建,但未启动线程。可运行(Runnable):是指一旦时间分片机制对一个线程有空闲的CPU周期,那个线程就可以立即开始运行。死(Dead):一个线程从自己的run()方法返回后,已经“死”了。也可以调用stop()使其消亡。堵塞(Blocked):线程可以运行,但有东西在阻塞它。如果一个线程被阻塞,调度机制可以简单地跳过它,不给它分配任何CPU时间。除非线程再次进入“可运行”状态,否则不会采取任何操作。线程的生命周期线程为何会堵塞
(1) 调用sleep(毫秒数),使线程进入“睡眠”状态。在设定的时间内,这个线程是不会运行的。
(2) suspend()用于暂停线程的执行。除非线程收到resume()消息,否则它不会返回到“可运行”状态。
(3) 用wait()暂停了线程的执行。除非线程收到 nofify()或者notifyAll()消息,否则不会变成“可运行” (是的,这看起来同原因2 非常相象,但有一个明显的区别是我们马上要揭示的)。
(4) 线程正在等候一些 IO(输入输出)操作完成。
(5) 线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。
睡眠
IO 堵塞
若一个数据流必须等候一些IO 活动,便会自动进入“堵塞”状态。在本例下面列出的部分中,有两个类协同 通用的 Reader 以及Writer 对象工作(使用Java 1.1 的流)。
线程冲突的原因
堆内存:进程公共区域,存储所有线程都可以看到的资源。
用synchronized修饰符来解决
在任务线程中增添一个静态属性object,并用synchronized对其上锁做到“监听器”的作用。
Java提供了解决线程之间通信问题的方法
解决多线程并发安全问题
解决多线程的并发安全问题,java无非就是加锁
(1)synchronized 是互斥锁;
(2)ReentrantLock 顾名思义 :可重入锁
(3)ReentrantReadWriteLock :读写锁