1、什么是多线程
线程是进程中的一个执行单元,又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。
而多线程是一种机制,它允许在程序中并发执行多个指令流,每个指令流都成为一个线程。多线程进制下的线程彼此间相互独立,容易共享数据,通过并发执行的方式来提高程序的效率和性能。
2、进程和线程的区别
- 线程的划分尺度小于进程,线程属于某一个进程;
- 进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程不可以独立的占用这些资源。
- 进程之间相互独立,通信困难,而线程之间共享一块内存区域,通信方便;
- 进程在执行过程中,包含固定的入口、执行顺序和出口,而线程的这些过程会被应用程序所控制。
3、如何让一个类成为线程类
一个是实现java.lang.Runnable接口和继承java.lang.Thread类。本质上线程类是需要实现Runnable接口,只是Thread还提供了一些额外的方法。
4、解释Runnable接口和Thread类的区别
- 线程类继承自Thread类则不能继承其他类,Runnable接口可以;
- 线程类继承自Thread相对于Runnable来说,使用线程的方法方便一些;
- 实现Runnable接口的线程类的多个线程,可以更方便的访问同一个变量,而Thread类则需要内部类来进行替代。
5、如何启动一个线程
如果该类继承自Thread类,可以通过new关键字创建一个线程对象,执行start()方法开启一个线程。实现类Runnable接口的线程类,需要调用它的对象实例,作为Thread类构造方法的参数,创建一个Thread对象,然后调用start()方法开启一个线程。
6、如何用synchronized让线程同步
synchronized关键字代表要为某一段代码加上一个同步锁,这个锁是绑定在某一个对象上的。如果是同步代码块,需要为该synchronized关键字提供一个对象的引用;如果是同步方法,只需加一个synchronized关键字的修饰。
synchronized为某段代码加上锁之后,某个线程进入该代码之前,首先要检查该锁是否被占用,如果没有被占用才能仅需执行,否则需要等到该所被释放后才能执行。其中,线程执行完该代码就是释放锁的标志。
7、如何使用Java的线程池
线程池属于对象池,所有的对象池都有一个非常重要的共性,就是为了最大程度的复用对象。因此,线程池的最重要的特征就是最大程度的利用线程。其次Java线程池的编程模型相对于原有的多线程模型,就是线程代码和业务代码的分离。
Java提供了java.util.concurrent.ThreadPoolExecutor类来使用线程池,通过它构造的对象,可以很容易地管理线程。