多线程与进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程与进程相关的知识,希望对你有一定的参考价值。
进程是操作系统中运行的一个任务(一个应用程序运行
在一个进程中)
进程中所包含的一个或多个执行单位称为线程(thread)
多线程
多线程允许我们可以"同时"执行多段代码
实际上多线程是并发运行的,即:JVM中的线程调度会为多个
线程分配"CPU时间片",并将这些时间片尽可能均匀的分配
给线程,当一个线程获取时间片后,该线程热任务代码被
CPU执行,其他线程处于等待状态,这种宏观上同时运行而微观
上走走停停的现象被称为并发.
java中的线程是由Thread的实例表示.
而Thread的创建有两种方式:
1:继承Thread并重写run方法
2:实现Runnable接口并重写run方法来单独定义任务
start方法的做作业是将线程纳入线程调度.一旦start方法
执行完毕后,那么该线程的run方法会很快被运行(只要获
取了CPU时间片)
线程同步是并发运行代码,两段代码间不存在先后运行的概念.
有先后顺序运行多段代码称为:同步执行
多线程在运行多段代码时是:异步运行(各自执行各自的)
第一种创建线程的方式虽然定义简单,但也存在一些不足:
1:由于java是单继承的,这经常导致在实际开发中,为了
复用一个类的方法,我们需要继承那个类,而自身又希望
是一个线程时导致的继承冲突
2:继承了线程需要重写run方法来定义该线程执行的任务代码,
这就导致了线程与执行的任务有一个必然的耦合关系,不利于
线程的复用.
线程优先级
对于线程调度的工作,线程不能干涉,即:线程只能被动
的等待分配CPU时间片,而不能主动获取.
可以通过修改线程优先级来最大程度改善获取CPU时间片
的几率, 理论上, 线程优先级越高的线程获取CPU时间片
的次数越多.
线程的优先级有10个等级,分别用整数1-10表示.
其中1位最低,10最高,5位默认值
守护线程 守护线程也被称为后台线程
默认创建出来的线程都是前台线程,若要设置为后台线程
可以通过线程提供的方法setDaemon来完成
后天线程使用上与前台线程一样,但是在结束时机上有
一点是不同的,即:当一个进程结束时,所有正在运行的
后台线程都会强制结束.而进程的结束时当一个进程中
所有前台进程都结束时结束.
所以将来开发中可以将一直保持运行的任务,但是可以随着
程序一同结束的放在后台线程上运行
进入阻塞状态,直到download执行完毕才会解除阻塞继续
执行后续代码
局部变量时,该方法必须是final的
JDK1.8之后由于内存问题被重新定义,不在有这个问题,
所以就不再需要上述设定.
有效的缩小同步范围可以在保证并发安全的前提下
提高并发的效率
同步块可以更精确的控制需要同步执行的代码片段.
有效缩小同步范围提高并发效率但是需要注意,
同步块需要指定"同步监视器"即:上锁的对象,要
保证需要同步运行该代码的线程看到的该对象是同一个.
多线程并发安全问题
当多个线程并发访问统一资源时,由于线程切换时机不确定
导致代码未按照设计方式的顺序执行导致的逻辑混乱.严重
时可能导致系统瘫痪.
解决多线程并发安全的手段是将"各干各的"变为"排队执行"
当一个方法被synchronized修饰后,那么该方法称为"同步
方法",即:多个线程不能同时进入到方法内部执行
在方法上使用synchronized修饰后,上锁的对象就是当
前方法所属对象,即:方法中看到的this
静态方法使用synchronized,那么一点具有同步效果
静态方法上锁的对象是该方法所属类的类对象
实际上JVM在加载一个类的class文件时,会实例化一个Class
类型的实例去保存该类的信息(属性,方法等).所以JVM
中每个加载过的类都有且只有一个Class的实例用于表示它
这个Class的实例就是该类的类对象
线程安全的集合也不与迭代器遍历集合的操作 互斥,但是
迭代器要求遍历的过程中不能通过集合的方法增删元素,
否则会抛出异常,所以在多个线程间有这样的操作时,
需要自行维护遍历 集合与集合元素操作间的互斥关系.
1:控制线程数量.因为线程数多了,会导致内存开销大.
严重时会导致系统瘫痪,并且由于线程数量多会导致
CPU过度切换,拖慢系统响应.
2:重用线程
以上是关于多线程与进程的主要内容,如果未能解决你的问题,请参考以下文章