java基础之多线程(一)--线程基础

一、基础知识

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方法,该线程结束生命周期。

猜你喜欢

转载自blog.csdn.net/yzy199391/article/details/81349389