-
当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。
-
并发性(concurrency)和并行性(parallel)是两个概念,并行指在同一时刻,有多条指令在多个处理器上同时执行;并发只在同一个时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
-
多线程拓展了多进程的概念,使得同一个进程可以同时并发处理多个任务。线程(Thread)也被称为轻量级进程(Lightweight Process),线程是进程的执行单元.
-
线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不拥有系统资源。
-
操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。
-
进程中线程之间的隔离程度很小,他们共享内存、文件句柄和其他每个进程应有的状态。
-
线程共享的环境包括:进程段代码、进程的公有数据等。利用这些共享的数据,线程很容易实现相互之间的通信。
-
JAVA使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。
-
不要忘了JAVA程序运行时默认的的主线程,main()方法的方法体就是主线程的线程执行体。
-
使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。
-
采用Runable接口的方式创建的多个线程(同一个Runable对象包装为多线程)可以共享线程类的实例属性。
-
创建线程的三种方式对比:
实现Callable接口和实现Runable接口的方式基本相同,知识Callable接口里定义的方法有返回值并且可以抛出异常,因此可以将Callable和Runable归为一种方式。他们与继承Thread方式之间的主要差别如下:
采用接口实现方式:
优点:线程类知识实现了接口,还可以继承其他类。这种方式下多个线程可以共享同一个对象,非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰地模型,较好的体现了面向对象的思想。
缺点:编程稍稍复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
采用继承Thread类的方法创建多线程
优点:编写简单,如果要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
缺点:因为线程类已经继承了Thread类,所以不能再继续继承其它父类。
因此,一般推荐采用实现Runable接口、Callable接口的方式来创建多线程。
13. 当主线程结束时,其他线程不收任何影响,并不会随之结束。一单子线程启动起来后,他就拥有和主线程同等的地位,不会受主线程影响。
14. 后台线程有个特点:如果所有的前台线程都死亡,则后台线程自动死亡。
15. sleep()方法用来暂停程序的执行,线程进入阻塞状态。yield()方法也是暂停程序,但他不会阻塞该线程,只是将他转入就绪状态。
16. 当使用synchronized同步时,系统自动对相关对象进行锁定,使用sleep()方法不会释放当前同步监视器。
17. 可使用ReentrantLock同步锁进行同步。
18. sleep()输入Thread类静态方法,wait()/notify()/notifyAll()属于Object类的方法,这三个方法必须由同步监视器对象来调用。调用wait()方法时当前线程会释放对该同步监视器的锁定。
19. 如果程序不使用synchronized来保证同步,而是直接使用Lock对象来同步,则系统中不存在隐式的同步监视器,也就不能使用wait()等方法进行通信。
20. JAVA还可以使用Condition/BlockingQueue进行线程通信。