java基础之线程
线程是java语言中比较重要的一个概念,这篇文章就来写写java中的线程,包含的知识点有点多,包括线程基础、多线程基础、juc包。先总结下java中的线程。
线程概念:
操作系统中的多任务:一个程序同时执行多个任务。例如在编辑或者下载邮件的同时可以打印文件,但是并发的进程数并不是由CPU数目制约的,操作系统将CPU的时间片分配给每一个进程,给人并行处理的感觉。
多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程(thread),它是线程控制的总称。可以同时运行一个以上的程序称为多线程程序。
多进程与多线程的区别:
本质的区别在于每个进程拥有自己的一整套变量,而线程共享数据。
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。
线程的实现:
- 继承Thread类重写run方法
- 实现Runnable重写run方法
- 实现Callable<T>接口重写call方法
线程状态与转换
线程有6种状态
- 创建(NEW)状态
- 就绪(runnable)状态
- 运行(running)状态
- 阻塞(blocked)状态
- 等待(WAITING)状态
- 终止(dead)状态
线程上下文切换:存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行
Thread的run方法,只会执行同一个线程中的任务,而不会启动新线程,启动新线程应该使用Thread的run方法
停止线程:
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
- 使用stop方法强行终止线程,但是不推荐使用这个方法,因为stop和suspend及resume一样,都是作废过期的方法,使用他们可能产生不可预料的结果。
- 使用interrupt方法中断线程,但这个不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。调用interrupted()来判断线程是否被中断
线程同步概念:
在大多数的多线程应用中,两个或者两个以上的线程需要共享对同一个数据的存取,如果两个线程存取相同的对象,并且每个线程都调用了一个修改该对象状态的方法,根据各线程访问数据的次序,可能会产生错误的结果,这个对象通常称为竞争条件,这时候就需要线程的同步来解决竞争。
关于线程的同步,java语言提供了synchronized关键字已经juc包中的一些工具类。
Java5以前有synchronized关键字,Java5之后提供了juc包中的一些工具,包括Lock、Semaphore、CountDownLatch、CyclicBarrier等。
java并发的东西比较多,需要用多篇文章来详细说明,对线程的介绍就先到这里。