JAVA中进程、线程

来源:互联网 发布:数控铣床编程四叶草 编辑:程序博客网 时间:2024/06/07 09:02

进程与线程的概念

进程:一次程序的执行,是系统资源调度和分配的基本单位
线程:是进程中独立运行的子任务,是CPU调度和分配的基本单位,线程被调用的时机是随机的。
进程与线程的关系:
1.一个进程可以有多个线程,一个线程只能属于一个线程
2.系统分配资源给进程,同一进程的线程共享该线程的资源
3.进程间可以并发执行,同一进程的线程也可以并发执行

进程的通讯方法

1.管道:具有亲缘关系的线程可以互相通信
2.有名管道:除具有管道的功能,非亲缘关系的线程可以互相通信
3.信号:用于进程通信以及发送信号给进程本身
4.信号量:允许多个线程同时使用共享资源,限制同一时刻可以访问资源的最大线程数目,用一个计数器来控制
5.消息队列:消息的链表,具有读权限的线程可以读走消息队列里面的信息,具有写权限的线程可以将信息写入消息队列里面
6.共享内存:多个线程访问同一块内存空间(如传递文件)
7.socket:不同机器间通信

线程的通讯方式

1.锁机制:1.互斥锁(排他,一个时间只能有一个线程来运行当前模块)2.条件变量(与互斥锁一同使用,以原子方式阻塞进程,直到某个特定条件为真)3.读写锁(多个进程可以同时读取共享数据,写操作是互斥的)
2.信号机制:用于线程间的通讯以及发送信号给线程本身
3.信号量机制:无线线程信号量与命名线程信号量(没有理解?)

三个概念:
1.临界区:任一时刻只允许一个线程对共享资源进行访问
2.互斥量:拥有互斥对象的线程才具有访问资源的权限,互斥量不仅在同一进程内的线程实现资源的共享访问,不同进程的线程见也可以实现对共享资源的访问
3.信号量:允许多个线程对共享资源进行访问,限定访问共享资源的最大线程数目,相当于一个程序计数器

线程方法介绍

1.currentThread():返回当前代码正在被那个线程调用的信息
2.isAlive():判断当前线程是否处于活动状态。活动状态是指线程已经启动且尚未终止。
3.sleep(long time):让当前正在执行的线程在指定毫秒数内休眠(暂停行为)。
3.getId():获得当前线程的唯一id
4.interrupt():停止当前线程,但并不是真的停止线程,只是在当前线程打了一个停止标记
5.suspend():当前线程挂起(暂停线程)
6.resume():恢复线程的执行。注:使用这两个方法可能会造成公共同步对象被独占以及数据不同步。
7.yield():放弃当前CPU资源,将其让给其他任务去占用CPU执行时间,放弃时间不确定
8.setPriority():设置线程优先级,优先级较高的线程得到的CPU资源较多,特性:继承性(子类可继承父类的优先级)、规则性(CPU尽量将执行资源让给优先级较高的线程)、随机性(优先级较高的线程并不一定先执行完任务)
9.join():阻塞直到子线程运行完毕
10.setDemon(true):守护线程。当程序只剩下守护线程的时候,虚拟机就退出了,程序也没必要执行了。JVM垃圾回收、内存管理等都是守护线程

线程的5大状态

新建状态:新创建的线程对象,还没有执行start方法
可运行状态:执行start方法,但还没有执行run方法,开始抢夺CPU资源
运行状态:获得CPU资源,执行run方法
阻塞状态:由于某种原因线程让出了CPU资源,其处于可运行状态的线程可以可以抢夺CPU资源来运行
死亡状态:线程死亡(1.run方法正常退出自然死亡 2.非正常异常终止了run方法)

具体图谱如下:

这里写图片描述

实现线程的方法

1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法,用实现的对象作为Thread构造函数的参数,即 new Thread(Runnable r);
3.实现Callable接口,重写call方法,与Runnable相比,具有返回值,可以通过Future来获得返回值(异步)
Future future=Excutors.newSingleThreadExecutor().submit(new CallableDemo());
返回值:future.get();

start与run的区别

1.start相当于创建了一个新线程并且交于线程规划器去执行,里面调用了run方法
2.run方法并没有创建新线程,只是在原线程来调用

停止线程的方法

1.线程正常退出,run方法完成结束
2.stop:强制退出:1.可能是的一些清理工作并没有完成 2.强制释放锁可能会造成数据不同步
3.interrupt方法:使用interrupt来中断线程,但并不是立即中断,需要在while轮询里使用条件变量(boolean)或者interrupted(检测线程是否中断,重置标志位为false)或者isInterrupted来控制中断状态(检测线程是否中断,不重置标志位)

sleep与wait方法的区别

1.sleep是在Thread包下,而wait是在Object包下
2.sleep方法可以在任何地方使用,wait/notify/notifyAll只能在同步方法或者同步代码块中使用(由于竞争条件的存在,若不在同步方法中执行,可能会出现错误)
3.sleep不会释放锁,而wait会释放锁

双亲委派模式

类加载器是JAVA运行时环境的一部分,负责动态加载JAVA类到JAVA虚拟机的内存空间。层次结构为:启动类加载器(bootstrap classloader)–扩展类加载器(extension classloader)–应用程序类加载器(system classloader).

双亲委派模式要求除了顶层的启动类加载器以外,其他类加载器都应该有自己的父类加载器,当这些类收到加载请求时,首先将请求委派给父类进行加载,若父类无法加载,子类才会进行加载

好处:
1.避免重复加载,父类加载的子类就不需要进行加载
2.安全性。若我此时定义一个Integer来覆盖默认Integer,初始化后就会出错,但使用双亲委派模式后,则会加载JDK中的类而不会加载自定义类。

原创粉丝点击