1.并行和并发有什么区别?
-
并发是指多个任务交替执行,通过任务切换实现并行的错觉。
-
并行是指多个任务同时执行,各自在不同的处理单元上进行。
2.线程和进程的区别?
进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。
3.守护线程是什么?
-
守护线程:运行在后台,为其他前台线程服务。
-
一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作。
-
如垃圾回收线程
4.创建线程的几种方式?
-
继承 Thread 类创建线程;
-
实现 Runnable 接口创建线程;
-
通过 Callable 和 Future 创建线程;
-
通过线程池创建线程。
5.Runnable 和 Callable 有什么区别?
-
Runnable 接口中的 run() 方法的返回值是 void,它做的事情只是纯粹地去执行 run() 方法中的代码而已;
-
Callable 接口中的 call() 方法是有返回值的,是一个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果。
6.线程状态及转换?
Thread 的源码中定义了6种状态:new(新建)、runnnable(就绪)、运行(Running)、 terminated(终止)、blocked(阻塞)、waiting(等待)或time waiting (定时等待)。
7.sleep() 和 wait() 的区别?
1、sleep() 方法是让出cpu(到了指定时间,自动回到原线程);wait() 方法是让出同步资源锁(需notify() 唤醒,或加过期时间); 2、sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用; 3、sleep()是Thread的一个静态方法;wait()是Object的方法。
8.线程的 run() 和 start() 有什么区别?
run()
和 start()
是线程的两个重要方法,它们有以下区别:
-
run()
方法是线程的实际执行逻辑。我们可以在run()
方法中编写线程的具体操作,例如执行某些任务、运行循环等。当run()
方法执行完毕时,线程就会结束。 -
start()
方法用于启动线程。调用start()
方法后,系统会为线程分配资源并调用线程的run()
方法。注意,我们不应直接调用run()
方法来启动线程,而应该使用start()
方法,因为直接调用run()
方法只会在当前线程中执行run()
方法的代码,并不会创建新的线程。 -
由于
start()
方法会为线程分配资源并调用run()
方法,因此每次调用start()
方法都会创建一个新的线程来执行线程的代码。多次调用start()
方法会启动多个线程并发执行,而多次调用run()
方法只是在当前线程中执行run()
方法的代码,并不会创建新的线程。
总结起来,run()
方法是线程的实际执行逻辑,我们可以在其中编写线程的具体操作;start()
方法用于启动线程,创建并调度一个新的线程来执行线程的 run()
方法。要正确启动线程,应该使用 start()
方法而不是直接调用 run()
方法。
9.在 Java 程序中怎么保证多线程的运行安全?
线程安全在三个方面体现:
原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized、volatile);
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before 原则)。
10.Java 线程同步的几种方法?
1、synchronized关键字实现的同步代码块或者同步方法 2、ReentrantLock实现了Lock接口的可重入锁 3、ThreadLocal人手一份线程私有变量,保证了线程安全 4、原子变量内部的CAS自旋操作实现了多线程下的同步