线程:
(2)线程创建的方式,详细说明。以及对线程池的理解
线程创建的方式有两种:
一种是继承Thread类,步骤是:
1、定义Thread类的子类,并重写该类的run方法,run方法的方法体就是线程要执行的任务。
2、创建Thread子类的实例,也就是创建了线程对象。
3、调用线程对象的start方法来开启线程。
另一种是实现Runnable接口,步骤是:
1、定义Runnable接口的实现类,并重写该接口的run方法,run方法的方法体就是线程要执行的任务。
2、通过Thread类创建线程对象,并将实现了Runnable接口的对象作为Thread类的构造函数的参数进行传递。
3、调用Thread类的start方法开启对象。
线程池:
线程池顾名思义就是装着线程的池子,线程池在系统启动时就会创建大量空闲线程,程序将一个Runnable对象传给线程池,
线程池就 会启动一条线程来执行该对象的run方法,当run方法执行结束后,该线程并不会死亡,而是再次返回线程池中成
为空闲状态,等待执行下一个Runnable对象的run方法。提高系统性能,对于请求量很少的时候看起来没多少作用。但是当
系统使用人数多了,请求数量很多的时候就会为系统节约大量的资源,让系统不去忙于线程的创建和销毁,而让系统更好的
完成他的功能。除此之外,线程池可以通过设置参数来控制系统中并发线程数目保证系统性能。使用线程池来执行线程的步骤:
1、调用Exectors类的静态工厂方法创建一个ExectorService对象,该对象代表一个线程池。
2、创建Runnable实现类的实例,作为线程执行任务。
3、调用ExectorService的submit方法来提交Runnable实例。
4、当不想提交任何任务时调用ExectorService对象的shutdown方法来关闭线程池。
(2)多线程有哪些状态。
在线程的生命周期中有五种状态,新建,就绪,运行,阻塞,死亡。
当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,这时Java虚拟机只为它分配了内存,并初始化了其成员变量的值
。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的执行体。
当线程对象调用了start()方法之后,该线程处于就绪状态,处于这个状态的线程并没有开始运行,它只是表示该线程可以运行了,至于
该线程何时开始运行,取决于JVM里线程调度器的调度。
处于就绪状态的线程获取了cpu,开始执行run方法的线程执行体,则该线程处于运行状态。
只要线程执行体不是足够短,瞬间就执行完了的话,线程在运行过程中需要被中断,目的是使其他线程获得执行的机会。这时线程就处于
阻塞状态,被阻塞的线程在合适的时候重新进入就绪状态等待线程调度器再次调度它。
引起阻塞的原因:1、线程调用sleep方法主动放弃所占用的处理器资源;2、线程调用了一个阻塞式IO方法,在该方法返回之前该线程被阻 塞;3、线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。4、线程在等待某个通知(notify);5、程序调用了线程的
suspend方法将该西安火车呢过挂起。
(3)sleep和wait的区别
总共有4点区别:
1、这两个方法来自不同的类sleep来自Thread类,wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码 中 调用sleep。
2、sleep方法不释放锁,也就是系统资源;wait方法释放了锁,使得其他线程可以同步控制块或者方法。
3、wait,notify/notifyAll是成对出现的,他们只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
(4)线程和进程的区别
进程是程序在计算机上的一次执行活动。当运行一个程序时,系统就启动了一个进程。程序是死的(静态的),进程是活的(动态的)。
线程是一段数据指令集合,是进程的一个执行单元,也是进程的可调度实体。
区别:
1、进程内的线程共享所在进程的地址空间。而每个进程都有自己独立的地址空间。
2、进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
3、线程是处理器调度的基本单位,但进程不是。
4、一个程序至少有一个进程,一个进程至少有一个线程.
(5)你认为线程重要的方面有哪些。
两个方面:
一个是线程的同步运行安全问题:当多线程执行共享数据时,CPU会在线程间不停切换,这种切换我们是不能控制的,当线程在执行共享数据过程中CPU是可能切换到其他线程,所以线程就会出现完全问题,这时我们需要使用到同步代码块synchronized。当线程进入到同步代码块里面时,需要获取一把锁,OBJECT对象都行,其他线程会处于临时阻塞状态,知道该线程把共享数据操作完成才能执行其他数据。还有同步函数,同步函数操作的锁为this(调用这个
方法的对象),静态同步方法的锁为 类名.class
一个是系统的性能:为了提高多线程的性能,就可以使用JDK1.5提供的线程池。
(6)怎样启动线程
调用线程对象的start方法。
(7)同步
(8)死锁:
是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
|
|