张孝祥java视频学习笔记(四)

第五讲 多线程

进程和线程:在多任务系统中,每个独立执行的程序称为进程。操作系统负责对CPU等设备的资源进行分配和管理,虽然这些设备某一时刻只能做一件事,但以非常小的时间间隔交替执行多个程序,因此给人同时执行多个程序的感觉。

一个进程中可以包含一个或多个线程,一个线程就是一个程序内部的一条执行线索,如果要一个程序中实现多段代码同时交替运行,就需产生多个线程,并指定每个线程上所要运行的程序代码段,这就是多线程。

Thread类创建线程

要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是Thread类的子类,即编写一个继承Thread类的子类,同时在子类中覆盖父类的run函数,在子类的ran函数中调用想在新线程上运行的程序代码。

启动一个新线程,不是直接调用Thread的子类对象的run方法,而是调用Thread子类对象的start方法,Thread类对象的start方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法,根据面向对象的运行时的多态性,在该线程上实际运行的是Thread子类对象中的run方法。如果调用Thread子类对象的run方法而不是start方法,则不会产生新的线程,而是一直执行Thread子类对象中的run方法结束以后才回到main方法中继续执行。

后台线程与联合线程:对某个线程对象在启动之前调用了setDaemon(true)方法,这个线程就变成了后台线程。

java程序来说,只要还有一个前台线程在运行,这个线程就不会结束。

pp.join()的作用是把pp所对应的线程合并到调用pp.join();语句的线程中。

join()方法可以重载,如果是join()则一直合并,如果是join(long millis)则指合并该线程s毫秒以后又将该线程分开,以多线程的方式进行执行,如果是join(long millis,int nanos)合并时间为long毫秒int纳秒。

可以使用Thread(Runnable target)这个构造方法来创建一个线程。

当我们要将已经集成了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,这时只能采用实现Runnable接口的方法来实现。

一般而言,都采用实现Runnable接口的方法来实现多线程,而不是通过继承Thread()类的方法来实现多线程。

多线程中另外一个比较典型的例子就是www服务器,www服务器是可以同时为若干个浏览者服务的,这就需要它为每一个来访者都创建一个线程,如果是单线程的话,在一个时间段就只能为一个人服务,其他人就只有干等的份了。

lesson5a.java 的运行结果有问题,ticket=100--,为什么会出现100+200+

同步代码块的设置——要避免多线程运行带来的风险,可以对语句块使用synchronized关键字,但synchronized关键字后面要加对象,对象可随意设置。synchronized的对象也叫做监视器。线程本身并不能控制CPU的分配,CPU的分配是由操作系统来调配的。

也可以用synchronized关键字来修饰函数,这样函数块的代码就可以整块执行。同步方法使用的监视器是“this”,如果想让同步函数和某块代码同步执行,可以让某块代码使用“this”对象作为监视器。

当产生并启动第一个线程的时候,这个线程不见得马上就开始执行,CPU可能还在原来的main线程上运行,为了让第一个线程启动后马上就能得到CPU,可以在产生第一个线程的语句后让main线程暂停哪怕是仅仅的一毫秒就能达到目的,即使用”Thread.sleep(1);”命令。

任何类型的对象都有一个标志位,该标志位具有01两种状态,其开始状态为1,当执行synchronized(object)语句后,object对象的标志位变为0状态,直到执行完整个synchronized语句中的代码块后又回到1状态。

同步是以牺牲程序的性能为代价的,如果确定程序没有安全性问题,就没必要使用同步控制。

死锁现象:多线程之间互相切换等待,无法继续往下执行。

如果多线程都访问同一个数据的时候,就会发生多线程安全问题。

定义类时,尽量将其中的成员变量定义成private访问权限,对成员变量的访问都通过类中的具有public访问权限的方法来进行,这样定义的类才是面向对象的,类中的数据由类自身的方法来操作,保证了程序的高内聚性和健壮性。

多线程的通讯问题

synchronized(o)->o.wait()->o.notify(),监视器对象必须一样。

一个进程就是一个包括有自身执行地址的程序。在Java中要实现线程功能,可以继承java.lang.Thread类,并重新定义run()方法,之后可以实例化自定义的Thread类,接着使用start()方法启动线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值