什么是进程和线程?
进程是操作系统进行资源分配的最小单位。资源包括cpu,内存空间,磁盘io等。同一进程里的多个线程共享该进程的全部系统资源。而进程与进程之间是相互独立的。
线程是cpu调度的最小单位,必须依托于进程而存在。
线程的优点及缺点?
线程的创建会进行资源分配:栈空间(1M)+ 句柄(文件描述符)等
优点:
1.充分利用cpu资源。
2.加快用户响应时间。
3.代码的异步话,模块化,简单化。
缺点:
1.多个线程共享该进程的所有资源,共享资源的安全性。
2.为了保证共享资源的安全性,肯定会加锁,容易产生线程与线程之间死锁。
3.线程数量增加会加重系统cpu资源的消耗。
线程创建的方式?
线程的创建方式就只有2种,这个是官方Thread类注释声明了的。可以去Thread源码看下。
1.继承Thread类
2.实现Runnable接口
Thread和Runnable的区别?
Thread是对线程的抽象,而Runnable是对任务调度的抽象。Thread可以接收任意Runnable的实例执行。
线程终止的方式?
1.调用线程的stop方法,stop方法不建议使用,它不能保证线程资源的释放。除非把线程的资源都释放了才调用stop方法。
2.调用interrupt方法,它不能保证线程马上终止,它只是给线程一个中断的通知,修改线程的中断标志位。interrupt方法通常和isInterrupted()和静态方法Thread.interrupted()联合调用。
代码示例:
线程通过检测自身的中断标识位是否设置为true而响应中断。通常通过调用isInterrupted()和静态方法Thread.interrupted()方法来判断是否被中断。isInterrupted()与interrupted()区别在于返回值不一样,isInterrupted()会返回true而interrupted()会把标志位修改成false来返回。通常情况下都选择使用isInterrupted方法。
线程在堵塞中(线程调用wait(),sleep(),join())也会执行interrupt和isInterrupted/Thread.interrupted()方法,但该线程并不会中断。线程处于堵塞状态,它对检测当前中断标志位是否设置为true,会在阻塞方法调用处抛出中断异常并把中断标识为马上设置成false。如果要把堵塞的线程中断必须在catch代码块里再次调用interrupt()方法。相当于要调用两次interrupt()方法;
示例:
线程的run方法和start()方法的区别?
Thread类是对java线程的抽象,new Thread()实例只是把线程挂载起来,并没有真正的执行。当线程调用start()方式时,线程才是真正的启动起来。start()方法让线程处于就绪状态等待cpu分配资源,分配到cpu资源时才会调用run方法。start()方法不能重复调用,否则抛出异常,而run()可反复调用它相当于类里的一个成员方法。
其他线程方法?
join():可以将两个交替执行的线程合并为顺序执行。 比如在线程 B 中调用了线程 A 的 Join()方法,直到线程 A 执行完毕后,才会继续执行线程 B。
yield():使当前线程让出 CPU 占有权,但让出的时间是不可设定的。也不会释放锁资源。注意:并不是每个线程都需要这个锁的,而且执行 yield( )的线程不一定就会持有锁,我们完全可以在释放锁后再调用 yield 方法。所有执行 yield()的线程有可能在进入到就绪状态后会被操作系统再次选中马上又被执行。
线程运行结构图