多线程复习

Posted jinit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程复习相关的知识,希望对你有一定的参考价值。

目录

一、线程与进程

二、java的线程使用

一、线程与进程

进程:系统运行的基本单元,当我们启动一个程序,就是一个进程从创建、运行到消亡的过程。进程可能会经历各种不同的状态,一般来说有三种状态。

  • 就绪态: 进程已经获得了除cpu以外的所有其它资源,在就绪队列中等待cpu调度
  • 执行状态: 已经获得cpu以及所有需要的资源正在运行
  • 阻塞状态(等待状态): 进程因等待所需要的资源而放弃处理器,或者进程本来就不拥有处理器,且其它资源也没有满足

状态转换: 就绪态的进程得到cpu调度就会变为执行状态,执行态的进程如果因为休眠或等待某种资源就会变为等待状态,执行态的进程如果时间片到了就会重新变为就绪状态放入就绪队列末尾,等待状态的进程如果得到除cpu以外的资源就会变为就绪状态注意处于等待状态的进程不能直接转变为执行状态,而首先要变为就绪状态,哪怕系统中只有一个进程。

技术图片

线程:线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。

  • 新建:就是刚使用new方法,new出来的线程;

  • 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;

  • 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;

  • 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;

  • 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

技术图片

二、java的线程使用

2.1通过继承Thread使用

java程序可以有两种方式创建执行线程,一是通过继承该类来构建自己的线程类,Thread类是一个实现Runnable接口的原生类,二是直接实现Runnable接口来构建自己的线程类。
UserThreadOne.java

public class UserThread extends Thread {
    private String threadName;
    private int index;
    private static final int LOOP_NUM = 100;

    public UserThread() {
        this.threadName = "";
    }

    public UserThread(String name) {
        this.threadName = name;
        this.index = 0;
    }

    @Override
    public void run() {
        while (index < LOOP_NUM) {
            System.out.println(this.threadName + "执行次数:" + this.index++);
        }
    }
}

ThreadTest.java

public class ThreadTest {
    public static void main(String[] args) {
        UserThread threadA = new UserThread("线程A");
        UserThread threadB = new UserThread("线程B");
        threadA.start();
        threadB.start();
    }
}
执行结果:

技术图片

2.2通过实现Runnable使用

UserRunnable.java

public class UserRunnable implements Runnable {
    private String threadName;
    private int index;
    private static final int LOOP_NUM = 100;

    public UserRunnable() {
        this.threadName = "";
    }

    public UserRunnable(String name) {
        this.threadName = name;
        this.index = 0;
    }

    @Override
    public void run() {
        while (index < LOOP_NUM) {
            System.out.println(this.threadName + "执行次数:" + this.index++);
        }
    }
}

ThreadTest.java

public class ThreadTest {
    public static void main(String[] args) {
        /*UserThread threadA = new UserThreadOne("线程A");
        UserThread threadB = new UserThreadOne("线程B");*/
        UserRunnable runnableA= new UserRunnable("线程A");
        UserRunnable runnableB = new UserRunnable("线程B");
        Thread threadA = new Thread(runnableA);
        Thread threadB = new Thread(runnableB);
        threadA.start();
        threadB.start();
    }
}

技术图片



以上是关于多线程复习的主要内容,如果未能解决你的问题,请参考以下文章

Java复习——多线程与并发库

多线程复习笔记

多个用户访问同一段代码

复习多线程

线程学习知识点总结

复习多线程二