先来说一说线程和进程的区别:

在电脑上打开一个app,任务管理器就想显示这个进程的名称,比如迅雷,而迅雷里面一下子可以同时下载多个文件,这多个文件的下载就可以看成多个线程;

所以进程和线程有包含的关系,一个进程包含多个线程;

线程开启的方式:

  1. 继承Thead类,重写run()方法;
  2. 实现Runnable接口,重写run()方法;
  3. 实现Callable接口,重写call方法如下图所示:

线程开启的方法是start();

线程的五种状态:

  1. 新建 线程被new
  2. 等待 调用start()
  3. 运行 被cup调用
  4. 阻塞
  5. 死亡

sleep()和wait()的区别:

sleep可以使当前线程休眠,不会释放锁 ,时间到了自动唤醒;

wait会释放锁,需要notify或者allnotify唤醒;

死锁的概念:

指几个线程相互竞争一个资源而造成相互等待的现象,如a线程需要b线程进入a才能出来,b需要a出来才能进入,所有就会造成相互等待;

解决死锁的方式:

  1. 加锁顺序;
  2. 加锁时限;