javaopp第七章

进程
进程(Process)是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。操作系统同时管理一个计算机系统中的多个进程,让计算机系统中的多个进程轮流使用CPU资源,或者共享操作系统的其他资源。
进程的特点是:
(1)进程是系统运行程序的基本单位
(2)每一个进程都有自己独立的一块内存空间、一组系统资源
(3)每一个进程的内部数据和状态都是完全独立的

线程
线程是进程中执行运算的最小单位,可完成一个独立的顺序控制流程。每个进程中,必须至少建立一个线程(这个线程称为主线程)来作为这个程序运行的入口点。

多线程的好处
(1)充分利用CPU的资源:执行单线程程序时,若程序发生阻塞,CPU可能会处于空闲状态,这将造成计算机资源浪费,而使用多线程可以在某个线程处理休眠或阻塞状态时运行其他线程,这样,大大提高了资源利用率。
(2)简化编程模型:一个即长又复杂的进程可以考虑分为多个线程,成为几个独立的运行部分,如使用时、分、秒来描述当前时间,如果写成单线程程序可能需要多重循环判断,而如果使用多线程,时、分、秒各使用一个线程控制,每个线程仅需实现简单的流程,简化了程序逻辑,这样更有助于开发人员对程序的理解和维护。
(3)带来良好的用户体验:由于多个线程可以交替执行,减少或避免了因程序阻塞或意外情况造成的影响过慢现象,降低了用户等待的几率。

Thread类常用方法
构造方法 说明
Thread() 分配新的Thread对象
Thread(Runnable target) 分配新的Thread对象,target为run()方法被调用的对象
Thread(Runnable target,String name) 分配新的Thread对象,target为run()方法被调用的对象,name为新线程的名称
Void run() 执行任务操作的方法
Void start() 使该线程开始执行,java虚拟机调用该线程的run()方法
Void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
String getName() 返回线程的名称
int getPriority() 返回线程的优先级
Int getPrority(int newPriority) 更改线程的优先级
Static Thread currentThread() 返回当前正在执行的线程对象的引用
Boolean isAlive() 测试线程是否处于活动状态
Void join() 等待该线程终止
Void interrupt() 中断线程
Void yield() 暂停当前正在执行的线程对象,并执行其他线程

主线程
在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。Java程序中的public static void main()方法是主线程的入口,每个进程都至少有一个主线程。它是程序开始时就执行的。主线程的重要性体现在以下两个方面:
(1)它是产生其他子线程的线程
(2)通常它必须最后完成执行,因为它执行各种关闭动作
尽管主线程在程序启动时自动创建,但它可以由一个Thread对象控制。为此,需要调用方法currentThread()获得它的一个引用,currentThread()方法是Thread类的公有的静态成员。

开发中,用户编写的线程一般都是指除了主线程之外的其他线程。使用一个线程的过程,可以分为四个步骤:
(1)定义一个线程,同时指明这个线程所要执行的代码,即期望完成的功能。
(2)创建线程对象。
(3)启动线程。
(4)终止线程。

继承Thread类创建线程
此方法创建线程类,此线程类需要继承Thread类并重写Thread类的run()方法。因为Thread类的run()方法是线程要执行操作任务的方法,所以线程要执行的操作代码都需要写在run()方法中,并通过调用start()方法启动线程后调用。
线程实例调用start()方法和调用run()方法有着天然之别,前者是启动线程,后者是调用实例方法,在实际应用中不要混淆。

实现Runnable接口创建线程
使用继承Thread类的方式创建线程简单明了,但它也有一个缺点,如果定义的类已经继承了其他类,则无法再继承Thread类。
Runnable接口定义在java.lang包中,其中声明了一个抽象方法run(),即public void run(),一个类可以通过实现Runnable接口并实现其run()方法完成线程的所有活动,已实现的run()方法称为该线程对象的线程体。任何实现Runable接口的对象都可作为一个线程的目标。

线程的优先级
线程的优先级用1-10表示,1表示由优先级最低,10表示优先级最高,默认值是5,这些优先级对应一个Thread类的公用静态常量。每个线程的优先级介于Thread.MIN_PRIORITY和Thread.MAX_PRIORITY之间之间。
线程的优先级可以通过getPriority()方法获取,setPriority(int grade)方法更改,后者的参数表示要设置的优先级,它必须是一个1—10的整数。

线程休眠:sleep() 线程的强制运行:join() 线程的礼让:yield()

线程同步的实现
1.同步方法:使用synchronized修饰的方法控制对类成员变量的访问。
2.同步代码块:代码块即使用{}括起来的一段代码,使用synchronized关键字修饰的代码块,称为同步代码块。其语法如下:
Synchronized(syncObject){
//需要同步的代码
}

在使用同步方法或同步代码块实现线程同步时,能够保证在同一时刻最多只有一个线程执行该代码。使用时有以下几点需要注意:
(1)当多个并发线程访问同一个对象object的synchronized(this)同步代码时,同一时刻只能有一个线程得到执行,其他线程必须等待当前线程执行完毕之后才能执行该代码块。
(2)当一个线程访问object得一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块的访问将被阻塞。即该线程获得这个object的对象锁,其他线程对该object对象所有同步代码部分的访问都被暂时阻塞。
(3)当一个线程访问object的synchronized(this)同步代码块时,其他线程任可以访问该object的非synchronized(this)同步代码块。

对比Hashtable和HashMap
(1)继承关系不同:两者都实现了Map接口,Hashtable继承Dictionary类,HashMap继承AbstractMap类。
(2)是否线程安全:Hashtable类型时线程安全的,其中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的,在多线程并发的环境下,可以直接使用Hashtable,如果使用HashMap就要自行增加同步处理。
(3)是否允许出现null值:在HashMap中,null可以作为键,也可以作为值,而HashMap中的键和值都不允许为null,否则将会出现NullPointerException异常。
(4)效率比较:由于Hashtable是线程安全的,其方法是同步的,而HashMap是非线程安全的,重速度,轻安全。当只需要单线程时,使用HashMap执行速度要高过Hashtable。

比较StringBuffer和StringBuilder
StringBuffer和StringBuilder都可用来存储字符串变量,是可变的对象。它们的区别是StringBuffer是线程安全的,而StringBuilder是非线程安全的。因此在单线程环境下,StringBuilder的执行效率较高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值