前言:
1.什么是线程?在操作系统中,线程是比进程更小的能够独立运行的基本单位,同时也是CPU调度的基本单位,线程本事不拥有系统资源,只是拥有一些运行时需要用到的系统资源,如程序计数器、寄存器、和栈。一个进程中素有的线程可共享进程中的所有资源
2.什么是多线程?多线程可以理解为在同一个程序中n能够同时运行多个不同的线程来执行不同的任务,这些线程同时利用CPU的多个核心运行。多线程编程能够最大限度的利用CPU调度
如何实现线程?
1.在java中实现线程的大体分为三种,,通过继承Thread类、是实现Runnablej接口、实现Callable接口
public class LearnThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}
class LeanRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
}
}
class LearnCallable implements Callable<String> {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
2.线程的生命周期
java线程的五种基本状态
1.新建状态(new):当线程对象创建后,即进入新建状态,如Thread t=new MyThread();
2.就绪状态(Runnable):当调用线程对象的start()方法(t.start()),线程即进入就绪状态,处理就绪状态线程,只是说明当前线程做好了准备,随时准备等待CPU调度执行,并不是说执行了t.start()就会立即执行
3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时的线程才开始被执行,即进入到运行状态,PS:就绪状态是进入运行状态的唯一入口,也就是说,线程想进入运行状态,必须先处于就绪状态
4.阻塞状态(Blocked):处于运行状态的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入就绪状态,才有机会再次被CPU调用进入就绪状态,根据阻塞产生的原因不同,阻塞状态又可以分为三种:
等待阻塞:运行状态线程执行wait()
同步阻塞: 线程在获取synchronized同步锁失败(因为锁被其他线程所占用),它会同步进入同步锁阻塞
其他阻塞:通过调用线程的sleep()或join()或发送I/O请求时,线程会进入阻塞状态,当sleep()状态超时、join()等待超时线程终止或者超时,或者I/O处理完成完毕,线程重新转入就绪状态
5.死亡状态:线程执行完或者因异常退出了run()方法,该线程生命周期
就绪状态转为运行状态:当前线程获取处理器资源
运行状态转为就绪状态:当前线程调用了yeid()或者在运行过程中失去了处理器资源
运行状态转为死亡状态:当前线程执行完毕或出现异常
ps:当调用线程的yield()方法时,线程从运行状态转换为就绪状态,但接下来CPU调度就绪状态中的哪个线程具有一定的随机性,因此,可能会出现A线程调用了yield()方法后,接下来CPU仍然调度了A线程的情况。