Java-多线程(并发)
Java中的多线程是每一个Java作为底层开发语言的开发人员都应该懂得。深入了解Java线程会发现其实Java线程是很广阔的领域,多线程是Java线程的入门。那么现在我给小伙伴们分享一下自己对Java多线程的一些见解。
关于线程的术语
void transferMoney(User from, User to, float amount){
to.setMoney(to.getBalance() + amount);
from.setMoney(from.getBalance() - amount);
}
线程的生命周期
线程的生命周期为:新建、就绪、运行、阻塞、死亡等五种状态。

这里写图片描述
新建状态
使用new关键字和实现类及其子类来新建一个线程对象后,该对象就处于新建状态。它能保持这个状态直到start() 方法开启这个线程。
注意:当一个线程处于新建状态时Java-多线程(并发),它仅仅是一个空的线程对象,系统不会为它分配资源。
就绪状态
当线程对象调用start() 方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列当中,等待JVM里线程调度器的调度。
Thread.strat();//调用start()方法
运行状态
如果就绪状态的线程的线程获取CPU资源,就可以开始执行run() 方法,此时线程就处于运行状态。此处的线程最为复杂,它可以变为阻塞状态、就绪状态、死亡状态。
阻塞状态
如果一个线程执行了sleep(睡眠)、(挂起)等方法Java-多线程(并发),失去所占用资源之后,该线程就从运行进入阻塞状态。在睡眠时间已到或者获得设备资源后可以进入就绪状态,可以分为三种:
死亡状态
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
线程控制
线程控制分为:线程睡眠、线程加入、线程让步、后台线程 。
线程睡眠
Thread.sleep(millis);//静态方法,使用类名调用。使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行。当中的millis是表示毫秒
线程加入
thread.join();//让当前线程等待thread线程结束之后才能继续运行
thread.join(millis);//让当前线程等待thead线程millis毫秒后运行
线程让步
thread.yield();//该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只是让同优先级的线程有执行的机会。
后台线程

thread.setDaemon(boolean on);//设置后台线程
前台线程和后台线程的区别
后台线程会随着主程序的结束而结束,但是前台进程则不会;或者说只要一个前台线程未退出,进程就不会终止。
默认情况下,程序员创建的线程的是用户线程:用(ture)可以设置线程为后台程序;而用()则可以判断一个线程是前台线程还是后台线程;
注意:方法必须在start方法前面设置,否则程序会抛出
异常。
线程优先级
在Java中,每一个线程都有一个优先级。默认情况,一个线程将继承其父线程的优先级。线程用数字来表示,范围从1到10,一个线程的缺省优先级是5。我们可以通过线程的方法进行设置线程的优先级。
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
使用下列方法获取或者设置线程对象的优先级
int getPriority();//获取线程优先级
void setPriority(int newPriority);//设置线程对象的优先级
注意: 可以通过方法(final的,不能被子类重载)更改优先级。优先级不能超出1-10的取值范围,否则抛出ion异常。
注意:不要假定高优先级线程一定先于低优先级的线程执行,不要有逻辑依赖于线程优先级,否则可能产生意外结果。
线程组
有些程序包含了相当数量的线程。这时如果按照线程的功能将他们分成不同的类别将很有用。
线程组可以用来同时对一组线程进行操作。
创建线程组
hreadGroup group = new ThreadGroup(groupName);
添加线程
将某个线程添加给某个线程组,使用如下方法:
Thread thread = new Thread(group, threadName);
中断所有线程运行
要中断线程组中所有的线程运行,使用下面的方法:
group. interrupt();
确认线程是否在运行
要确定某个线程组中的任一线程是否仍处于可运行状态:
if (group. activeCount() == 0){}
线程组有一个很好的特性,那就是如果某个线程由于异常事件而成为死线程,你将会得到通知
线程同步()

为了确保在任何时刻一个共享对象只被一个线程使用,必须使用“线程同步()”
线程同步方式
第一种:使用同步方法
synchronized void methodA(){}
第二种:使用同步代码块
synchronized(obj){//obj是被锁定的对象
//这里写入需要同步的语句
}
用来标识的块或方法即为监视器监视的部分。只有使用 ,才能利用对象的监视器功能。
调用任何方法时java多线程程序,对象会被锁定。不可以再调用那个对象的任何方法,除非第一个方法完成了自己的工作,并解除了锁定。因此,一个特定对象的所有方法都共享着一把锁,而且这把锁能锁定防止多个方法对通用内存的同时进行写操作(比如同时有多个线程 )。
每个类也有自己的一把锁(作为类的Class对象的一部分),所以 方法可在一个类的范围内被相互间锁定起来,防止与数据的接触。一般情况下,只在方法的层次上使用同步。
生产者vs消费者问题
在多线程程序中,可能出现生产者-消费者问题,即等待同步数据的问题。

这里写图片描述
可能出现的问题是:
1.生产者比消费者快时,消费者会漏掉一些数据没有取到 。
2.消费者比生产者快时,消费者取相同的数据。
当中的() 和 wait() 用来协调读取关系,()和wait ()都只能从同步方法中调用。
wait- 机制使用同步机制
1.如果两个或多个线程修改一个对象,请将执行修改的方法声明为方法。受到对象修改影响的只读方法也必须实现同步。
2.如果一个线程必须等待某个对象的状态出现变更,那么它应该在对象的内部等待而不是在外边等待。这可以通过进入一个方法,并且调用wait方法来实现。
3.不要在方法中花费大量的时间。大多数操作只是更新数据,然后很快返回。
4.每当一个方法改变某个对象的状态时,它就应该调用方法。这样可以给等待线程一个机会,以便查看环境有没有发生变化
5.记住,wait和/方法都属于类的方法,而不是类的方法。反复检查你对wait方法的调用与同一对象上的通知是否匹配。
线程死锁
定义:当所有的线程都在等待得到某个资源后才能继续运行下去时,整个程序将被挂起,这种情况就叫做线程死锁。
多线程的使用
有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了java多线程程序,而不是提。。
上下文的切换开销也很重要,如果你创建了太多的线程java多线程程序,CPU 花费在上下文的切换的时间将多于执行程序的时!
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » Java-多线程(并发)
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

