1.实现线程的几种方法?

1.集成Thread类,或者实现Runnable接口
2.通过线程池创建线程。
线程池:创建线程需要花费时间,一般使我们使用Executor框架可以创建不同的线程池。
corePoolSize:核心线程数,能够执行任务的线程数量。
maximumPoolSize:最大线程数,表明线程中最多能够创建的线程数量。
keepAliveTime:空闲的线程保留时间单位。
TimeUnit:空闲线程的保留时间单位。
workQueue:阻塞等待线程的队列。
threadFactory:创建线程的工厂。

执行过程:当线程数小于corepoolSize,每添加一个任务,就会开启线程执行,当corePoolSize满了以后的时候,后面添加的任务将放入缓冲队列中。,然后看是否超过了maximunPoolSize线程数,超过拒绝执行,不超过就创建线程执行。

2.线程的状态都有哪些?

新建状态(new,线程还没有开始执行),就绪状态(Runnable,一个新建的线程并不会自动运行,需要调用线程的start()方法),运行状态(Running,开始执行run()方法),阻塞状态(blocked,运行过程中,可能由于各种原因进入阻塞状态),死亡状态(dead,run方法自然退出,线程执行完毕,或者捕获了一个异常终止了run方法)阻塞状态的原因: 1.线程通过调用sleep方法进入睡眠状态
2.线程试图得到一个锁,而这个锁正被其他线程持有
3.线程正在等待某个触发条件

3.sleep和wait区别:

sleep是Thred方法,wait是属于onject类的,sleep是线程的睡眠,不让出线程,休眠完成后继续执行。
wait是让出线程,重新进入等待池。等待notify或者notifyAll方法本线程才会进入到线程池准备。

4.三个线程如何保证顺序执行?

Thred.join()方法。

5.如何避免死锁问题?

死锁是指两个进程因为争夺资源而造成的的一种相互等待的问题。 最简单的就是阻塞循环等条件,以一定的顺序来操作。
如果一个线程需要获取多个锁,一定得按照一定的顺序去获取。这个前提是你知道所有需要用到的锁。
一个线程尝试去获取锁时,规定在指定时间内获取不到,就放弃等待锁,并释放自己现有的所持有的锁,然后等待一定的时间,再去获取锁。
或者干脆写一个死锁检测的程序
利用数据结构,如使用map,每次线程的上锁和获取不到锁,都记录在里面,当一个线程获取不到锁时,就去查这个map,看一下有没有死锁,有的话就将map锁释放出来,然后各个线程稍作等待,再去竞争锁。释放锁时还可以设计优先级,优先级高的可以不释放。