1. 进程和线程的区别

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

 

2、创建线程的几种方式?


1、继承 Thread 类创建线程;
2、实现 Runnable 接口创建线程;
3、通过 Callable 和 Future 创建线程;
4、通过线程池创建线程。

 

3、runnable 和 callable 有什么区别?


Runnable 接口中的 run() 方法的返回值是 void,它做的事情只是纯粹地去执行 run()
方法中的代码而已;
Callable 接口中的 call() 方法是有返回值的,是一个泛型,和 Future、FutureTask
配合可以用来获取异步执行的结果。

 

Java 并发编程面试点上

7、sleep() 和 wait() 的区别?


1、每个对象都有一个锁来控制同步访问,Synchronized 关键字可以和对象的锁交互,来
实现同步方法或同步块。sleep() 方法正在执行的线程主动让出 CPU(然后CPU就可以去
执行其他任务),在 sleep 指定时间后CPU 再回到该线程继续往下执行(注意:sleep 方法
只让出了 CPU,而并不会释放同步资源锁);wait() 方法则是指当前线程让自己暂时退让
出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了 notify()
方法,之前调用 wait() 的线程才会解除 wait 状态,可以去参与竞争同步资源锁,进而得
到执行。(注意:notify 的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说
notify 只是让之前调用 wait 的线程有权利重新参与线程的调度);
2、sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;
3、sleep() 是线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保
持,不会释放对象锁,到时间自动恢复;wait() 是 Object 的方法,调用会放弃对象锁,进
入等待队列,待调用 notify()/notifyAll() 唤醒指定的线程或者所有线程,才会进入锁池,
不再次获得对象锁才会进入运行状态;

 

8、线程的 run() 和 start() 有什么区别?


1、每个线程都是通过某个特定 Thread 对象所对应的方法 run() 来完成其操作的,方法
run() 称为线程体。通过调用 Thread 类的 start() 方法来启动一个线程。
2、start() 方法来启动一个线程,真正实现了多线程运行。这时无需等待 run 方法体代码
执行完毕,可以直接继续执行下面的代码; 这时此线程是处于就绪状态, 并没有运行。
然后通过此 Thread 类调用方法 run() 来完成其运行状态, 这里方法 run() 称为线程体,
它包含了要执行的这个线程的内容, run 方法运行结束, 此线程终止。然后 CPU 再调度
其它线程。
3、run() 方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用
run(),其实就相当于是调用了一个普通函数而已,直接待用 run() 方法必须等待 run() 方
法执行完毕才能执行下面的代码,所以执行路径还是只有一条,根本就没有线程的特征,
所以在多线程执行时要使用 start() 方法而不是 run() 方法。

 

9、在 Java 程序中怎么保证多线程的运行安全?


线程安全在三个方面体现:
原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,
synchronized);
可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,
volatile);
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂
乱无序,(happens-before 原则)。

 

 

相关文章:

  • 2022-02-28
  • 2021-11-17
  • 2021-07-02
  • 2021-05-21
猜你喜欢
  • 2022-02-09
  • 2021-08-16
  • 2022-12-23
  • 2021-08-07
  • 2021-10-23
  • 2021-11-29
  • 2021-08-14
相关资源
相似解决方案