1、什么是线程?线程和进程的区别?
进程:
简单来说就是正在内存中运行的程序。具有独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位
线程:
简单来说就是进程中完成某个特定功能的执行单元。是进程的一个实体,是CPU调度和分派的一个基本单位,是比进程更小的可以独立运行的基本单位
并行:
是指两件事情在同一时刻都在执行
并发:
是指两件事情在同一时间段内都在执行,但是精确到某一时刻只有一个在执行
进程和线程、并发和并行的区别
进程和线程的区别:每个进程都有独立的内存空间(独立的栈和独立的堆)进程中每个线程独立的栈和共享进程的堆并发和并行的区别:并行是两个线程真的同时执行(CPU至少是2核)并发是两个线程看起来同时执行,实际上交替执行(CPU是单核也可以做到并发)
2、创建线程的几种方式?
1、继承Thread类并重写run方法,创建线程。实现简单但不可以继承其他类
2、实现Runable接口并重写run方法,创建线程。避免单继承局限性,编程更加灵活,实现解耦
3、实现Callable接口并重写call方法,创建线程。可以获取线程执行结果的返回值,并且可以抛出异常
4、使用线程池创建。(使用java.util.concurrent.Executor接口)
Runable和Callable的区别
Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息
线程的start和run方法的区别
线程对象调用run方法不开启线程。仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行调用start方法可以启动线程,并且使得线程进入就绪状态,而run方法只是thread的一个普通方法,还是在主线程中执行。
3、线程的状态,以及他们之间都是怎么切换的?

初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
阻塞(BLOCKED):表示线程阻塞于锁。 ```java 阻塞的情况分三种:
(一). 等待阻塞:运行状态中的线程执行 wait()方法,JVM会把该线程放入等待队列(waitting queue)中,使本线程进入到等待阻塞状态;
(二). 同步阻塞:线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),,则JVM会把该线程放入锁池(lock pool)中,线程会进入同步阻塞状态;
(三). 其他阻塞: 通过调用线程的 sleep()或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。
4. **等待(WAITING)**:进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。5.** ****超时等待(TIMED_WAITING)**:该状态不同于WAITING,它可以在指定的时间后自行返回。6. **终止(TERMINATED)**:表示该线程已经执行完毕。<a name="PrCHB"></a># 4、线程的相关方法有哪些?**线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等**<br />**<br />**1.****线程等待(wait) **<br />调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回。<br />需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。**2.****线程睡眠(sleep) **<br />sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态.**3.线程让步(yield) **yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对 线程优先级并不敏感。<br /> <br />**4.****线程中断(interrupt) **<br />中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位。这个线程本身并不会因此而改变状态(如阻塞,终止等)**5.Join ****等待其他线程终止 **<br />join() 方法,等待其他线程终止,在当前线程中调用一个线程的 join() 方 法,则当前线程转为阻塞状态,回到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu 的宠幸.**6.****线程唤醒(notify)**** **<br />Object 类中的 notify() 方法,唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个 wait() 方法,在对象的监视 器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有notifyAll() ,唤醒再次监视器上等待的所有线程。<a name="htpJT"></a>#### wait()和sleep()的区别?1. 来自不同的类```javawait():来自Object类;sleep():来自Thread类;
2.关于锁的释放
wait():在等待的过程中会释放锁;sleep():在等待的过程中不会释放锁
3.使用的范围:
wait():必须在同步代码块中使用;sleep():可以在任何地方使用;
4.是否需要捕获异常
wait():不需要捕获异常;sleep():需要捕获异常;
Java 中用到的线程调度算法是什么?
有两种调度模型:分时调度模型和抢占式调度模型。
