浅谈多线程基础知识

发布于: 2018-08-16    浏览: 1528    作者:Wu


进程和线程


进程是一次程序的执行,如查看“Windows任务管理器”中的列表,可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元。

线程可以理解成是进程中独立运行的子任务。一个进程可以有多个线程同时运行。


多线程实现方式


主要有两种:继承Thread类和实现Runnable接口。


继承Thread类


Thread类实现了Runnable接口。


public class Thread implements Runnable 

在使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关。线程是一个子任务,CPU以不确定的方式或者说是以随机的时间来调用线程中的run方法。

Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。这个过程其实就是让系统安排一个时间来调用Thread中的run()方法,也就是使线程得到运行,启动线程,具有异步执行的效果。此外,执行start()方法的顺序不代表线程启动的顺序。


实现Runnable接口


使用继承Thread类的方式来开发多线程在设计上有局限性,因为Java是单根继承,而使用实现Runnabel接口的方式来实现多线程技术可以克服这一点。

Thread构造函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象。


currentThread()方法


currentThread()方法可返回代码段正在被哪个线程调用的信息。


isAlive()方法


isAlive()方法的功能是判断当前的线程是否处于活动状态。


sleep()方法


方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。


getId()方法


getId()方法的作用是取得线程的唯一标识。


停止线程


在Java中有以下3种方法可以终止正在运行的线程: 
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 
2. 使用stop方法强行终止线程,这个方法已被deprecated。 
3. 使用interrupt方法中断线程


停止不了的线程


调用interrupt()方法仅仅是在当前线程种打了一个停止的标志,并不是真的停止线程。


判断线程是否是停止状态


Thread.java类提供了两种方法: 
1. this.interrupted():测试当前线程是否已经中断,执行后具有将状态清除为false的功能,静态方法。 
2. this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志。


在沉睡中停止


如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态值,使之变为false。


调用stop停止(deprecated)


调用stop()方法时会抛出java.lang.ThreadDeath异常,但在通常情况下,此异常不需要显式地捕捉。


yield方法


yield()方法(static)的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,,马上又获得CPU时间片。


线程的优先级


设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行。

设置线程的优先级使用setPriority(int newPriority)方法。


线程优先级的继承特性


在Java中,线程的优先级具有基础性,比如A线程启动B线程,则B线程的优先级与A是一样的。


优先级具有规则性


高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。

线程的优先级与代码执行顺序无关。



 ——本文并非原创,如有侵权请联系管理员删除。

在线客服

售前咨询

售后服务

投诉/建议

服务热线
0731-83091505
18874148081