线程知识点汇总

Source

1.了解进程和线程的区别:进程是程序一次动态执行过程,如打开QQ,打开浏览器。线程是进程基础上进行的进一步划分。比进程更小的执行单位。下面通过word的使用了解进程和线程的区别:
在word中如果出现单词拼写错误,word会在出错的单词下划出红线。那么实际上每次启动word对于系统而言就相当于启动了一个进程,而在这个进程之上又有许多其他程序在运行(如拼写检查),那么这些程序就是一个小小的线程。如果word关闭了,那么这些拼写检查也会随之消失,但是反过来如果拼写检查的线程消失了,word进程不一定会消失。

2.在Java中要想实现多线程操作有两种方法,一种是继承Thread类,一种是实现Runnable接口;
3.启动线程不能直接调用run方法,而应该是调用从Thread类继承而来的start()方法
4.如果一个类通过继承Thread类来实现多线程操作,那么只能调用一次start()方法,如果调用多次,将会抛出IllegalThreadStateException;
5.如果一个类只能继承Thread类才能实现多线程,必定会受到单继承局限的影响,所以一般来说,要想实现多线程还可以实现Runnable接口完成;
6. MyThread通过实现Runnable接口实现多线程不能直接通过MyThread对象调用start方法启动线程,必须把MyThread装在Thread的构造器中,通过Thread类的对象启动线程;
7.如果一个类继承Thread类,则不适合多个线程共享同一资源,而实现了Runnable接口,就可以方便地实现同一资源的共享。
8.线程共有五种状态:创建、就绪、运行、堵塞、死亡。
8.1) 就绪:新建线程对象后,调用该线程的START()方法就可以启动线程,当线程启动时,就处于就绪状态。此时线程将进入线程队列排队,等待CPU服务,此时它已具备运行条件。
8.2) 运行:当就绪状态的线程被调用并获得CPU资源时,线程就进入了运行状态。此时线程自动调用了线程对象的RUN()方法,RUN方法定义了该线程的操作和功能。
8.3) 堵塞:一个正在执行的线程在某些特殊情况下,如被人为扶起或需要执行耗时的输入输出操作时,会让出CPU并暂时中止自己的执行,进行堵塞状态。在可执行的状态下,如果调用SLEEP()、SUSPEND()、WAIT()等方法,线程将进入堵塞状态。堵塞时,线程不能进入线程队列,只有当引起堵塞的原因被消除后,线程才能进入就绪状态。
8.4) 死亡:线程调用STOP()方法时或RUN()方法执行结束后,即处于死亡状态,处于死亡状态的线程不具有继续运行的能力。

9.在Java中所有线程都是同时启动的,哪个线程先抢到CPU资源,哪个线程就先执行。
10.Java是多线程的编程语言,每个Java程序运行时至少启动两个线程,一个是main线程,一个是垃圾收集线程。
11.在Java中使用setName()方法为线程命名,使用getName()方法取得线程的名称,使用isAlive()方法测试线程是否启动而且正在运行
12.在Java中主线程有可能比其他线程先执行完,其他线程不受影响,不会因为主线程结束而结束。可以使用join()方法让一个线程强制执行,线程强制执行期间,其他线程无法运行,必须等此线程完成之后才可以继续执行。
13.通过Thread.sleep()方法让线程休眠,通过interrupt()方法中断其执行状态。
14.在Java中,只要前台有一个线程在运行,则整个java进程就不会消失,所以此时可以设置一个后台线程,这样即使Java进程结束了,此后台线程依旧会继续执行,要想实现这样的操作,直接使用setDaemon()方法即可。
15.在Java的线程操作中,所有线程在运行前都会保持就绪状态,那么此时,哪个线程的优先级越高,哪个线程就有可能会被先执行。在Java线程中使用setPriority()方法可以设置一个线程的优先级别,共有3个级别,分别是:MIN_PRIORITY、NORM_PRIORITY、MAX_PRIORITY。需要注意的是:并非线程的优先级别越高就先执行,而是哪个线程先执行由CPU调度决定。在Java中,主线程的优先级别是NORM_PRIORITY
16.在线程操作中,可以使用yield()方法将一个线程的操作暂时让给其他线程执行。
17.在线程操作中,为了解决共享资源的同步操作冲突,可以给代码块加入sycronized关键字或给方法加上sycronized关键字,来保证资源共享操作的正确性;
18.死锁是指两个线程都在等待对方先完成,造成程序停滞,一般程序的死锁都是在程序运行时出现的。
19.多个线程共享同一资源时需要进行同步,以保证资源操作的完整性,但是过多的同步就有可能产生死锁。
20.在线程操作中,可以通过加入同步(sycronized)、等待(super.wait())和唤醒(nofity()、noifyAll())来解决死锁的问题。
21.线程中有三个方法要慎用:
suspend():暂时挂起线程;
resume():恢复挂起的线程;
stop():停止线程。
这三个方法不推荐使用,因为在操作中会产生死锁的问题。
22.在线程操作中,是通过设置标志位的方式停止一个线程的运行,不能直接调用线程的stop()方法。