- 一、基础知识
- 1、 进程
- 2、 线程
- 二、线程创建
- 1、继承Thread类
- 2、实现Runnable接口
- 3、匿名内部类
- 三、线程状态
- 1、新建状态(New)
- 2、就绪状态(Runnable)
- 3、运行状态(Running)
- 4、阻塞状态(Blocked)
- 5、死亡状态(Dead)
一、基础知识
1、 进程
是一个正在执行中的程序,有执行顺序(即一组执行路径或控制单元)。
2、 线程
进程中的一条执行路径或一个控制单元;一个应用程序中一定会有一个主线程。
ps:为什么要用多线程?
提高程序运行效率
二、线程创建
1、继承Thread类
- 定义一个继承Thread类的类;
- 重写run()方法,防止创建线程执行的代码;
- 直接创建Thread的字类对象;
- 调用start()方法,开启线程并调用线程的run()方法执行
class ThreadExtend extends Thread {
public ThreadExtend(String threadName){
super(threadName);
}
/**
* 创建线程执行的方法都放在run方法中
*/
@Override
public void run() {
System.out.println("id:" + currentThread().getId() + ",继承Thread的线程被创建了,线程名为:" + this.getName());
for (int i = 0; i <= 20; i++) {
System.out.println("继承Thread的线程执行代码:" + i);
}
}
}
2、实现Runnable接口
- 定义一个类实现Runnable接口;
- 实现run方法,封装线程需要执行的代码;
- 创建实现类对象;
- 创建Thread类,使用含参数Runnable的构造函数;
- 调用上一步中创建的Thread类的start方法启动线程
class RunnableThread implements Runnable {
public void run() {
System.out.println("实现Runnable的线程被创建了!");
for (int i = 0; i <= 20; i++) {
System.out.println("实现Runnable的线程执行代码:" + i);
}
}
}
3、匿名内部类
class AnonymousInnerClassThread{
Thread thread = new Thread(new Runnable() {
public void run() {
System.out.println("通过匿名内部类创建了线程!");
for(int i = 0; i <= 20; i++){
System.out.println("匿名内部类线程执行代码" + i);
}
}
}, "anonymousInnerClassThread");
}
线程启动:
public class CreateThread {
/**
* java运行程序当中,jvm创建的任务都放在主线程中执行,主线程在main方法中执行
*
* @param args
*/
public static void main(String[] args) {
System.out.println("主线程启动.. id为:" + Thread.currentThread().getId());
for (int i = 0; i <= 20; i++) {
System.out.println("主线程执行代码:" + i);
}
//1. 继承Thread方式创建的线程启动方式
ThreadExtend thread1 = new ThreadExtend("yzyThread1");
//启动线程调用start方法,而不是run方法
thread1.start();
//2. 实现Runnable接口方式创建的线程启动方式
RunnableThread runnableThread = new RunnableThread();
Thread thread = new Thread(runnableThread);
thread.start();
//3. 通过匿名内部类创建的线程启动方式
AnonymousInnerClassThread anonymousInnerClassThread = new AnonymousInnerClassThread();
anonymousInnerClassThread.thread.start();
}
}
三、线程状态
1、新建状态(New)
仅new,未执行start方法,此时线程未开始执行run中封装的代码
2、就绪状态(Runnable)
调用start方法启动线程。此时线程不立即执行run方法,需要与其他线程竞争cpu时间,只有获取cpu时间才开始运行线程。即就绪状态的线程仅由start方法创建了线程运行所需的系统资源,并未调度线程运行的run方法
。
3、运行状态(Running)
获取cpu权限进行执行,线程只能从就绪状态进入到运行状态。
4、阻塞状态(Blocked)
正在运行的线程没有运行结束,暂时让出cpu,此时其他处于就绪状态的线程就可以获取cpu时间,进入运行状态。当线程再次进入就绪状态时,才有机会转到运行状态。阻塞情况分三种:
1)等待阻塞–通过调用wait()方法,让线程等待某工作的完成。
2) 同步阻塞–线程在获取synchronize同步锁失败(因为锁被其他线程所占用),他会进入到同步阻塞状态。
3)其他阻塞–通过调用线程的sleep()方法或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕,线程重新转入就绪状态。
5、死亡状态(Dead)
线程执行完或因异常退出run方法,该线程结束生命周期。