JAVA线程之一----基础概念

来源:互联网 发布:电脑安全防护软件排行 编辑:程序博客网 时间:2024/05/18 03:49
名词解释
进程

进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位。它具有独立性,动态性(相对于静止的程序),并发性。

线程
线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程
线程可以拥有自己的堆、栈、程序计数器、局部变量,但不能拥有系统资源

系统,程序/任务,进程和线程的关系
所有的系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的成勋就是一个进程,它是由系统进行资源分配和调度的独立单位。
进程,线程的优劣
A、进程之间不能共享内存,但线程之间共享内存非常容易。
B、系统创建进程需要为该进程重新分配系统资源,但创建线程则代价要小得多,因此使用线程来实现多任务并发比多进程的效率高。
C、 Java语言内置多线程功能支持,而不是单纯的作为底层操作系统的调度方式,从而简化Java的多线程编程。


综述:一个程序运行后至少有一个进程,一个进程可以包含多个线程。至少包含一个线程。

并发和并行
并发性(concurrency)和并行性(parallel  )是两个概念;
并发指在同一时刻,只能有一个指令(线程)执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。
并行指在同一时刻,有多条指令(线程)在多个处理器上同时执行。

线程生命周期
线程被创建启动后,并不是启动后就进入了执行状态,也不是一直处于的执行状态。
线程的生命周期分为创建(new)、就绪(Runnable)、运行(running)、阻塞(Blocked)、死亡(Dead)五种状态。
线程启动后不会一直霸占CPU资源,所以CPU需要在多条线程中切换执行,线程就会在多次的运行和阻塞中切换

控制线程
A、join线程
让一个线程等待另一个线程完成的方法。当某个程序执行流中调用其他线程的join方法时,调用线程将会被阻塞,直到被join方法的join线程执行完成为止。
B、后台线程
有一种线程,在后台运行,它的任务是为其他线程提供服务,这种线程被称为“后台线程(Daemon Thread)”,有被称为“守护线程”或“精灵线程”。
JVM的垃圾回收器线程就是后台进程。
C、线程休眠sleep
如果需要当前线程暂停一段时间,并进入阻塞状态就需要用sleep。
D、线程让步yield  [ji:ld]
yield和sleep有点类似,它也可以让当前执行的线程暂停,但它不会阻塞线程,只是将该线程转入到就绪状态。

sleep和yield的区别
(1)、sleep方法暂停当前线程后,会给其他线程执行集合,不会理会线程的优先级。但yield则会给优先级相同或高优先级的线程执行机会
(2)、sleep方法会将线程转入阻塞状态,直到经过阻塞时间才会转入到就绪状态;而yield则不会将线程转入到阻塞状态,它只是强制当前线程进入就绪状态。
因此完全有可能调用yield方法暂停之后,立即再次获得处理器资源继续运行。

(3)、sleep声明抛出了InterruptedException异常,所以调用sleep方法时,要么捕获异常,要么抛出异常。而yield没有申明抛出任何异常


wait() 和sleep()的联系及区别

联系:

二者都可以让线程暂停一段时间。

区别:二者的作用及目的不同,sleep() 是对线程的运行状态的控制,而wait ()是线程之间通讯的问题。
具体区别如下:

1.sleep()没有释放资源锁;而wait()释放了资源锁。(资源锁)

2.sleep()来之java.lang.Thread类;而wait()来自java.lang.Object类。(出身)

3.wait(),notify(),notifyAll()只能使用跟Synchronized一直使用;sleep()没有任何限制,可以任何地方使用。(使用范围)

4.sleep()需要捕获异常;wait(),notify(),notifyAll()不需要捕获。(异常)


synchronized 
同步代码块:    synchronized (object) {        //同步代码    } 

同步方法:    public synchronized void editByThread() {        //doSomething    }
 对于同步方法而言,无需显示指定同步监视器,同步方法监视器就是本身this  
原创粉丝点击