Java学习笔记八——Java多线程初步

时间:2023-02-26 16:34:50

Java多线程

概念

为什么使用多线程

线程的调度

主线程&多线程

线程的生命周期

创建线程

概念:

程序:一段静态的代码

进程:程序的一次动态执行过程,包括从加载到执行到执行完毕的完整过程,也是进程本身从产生到消亡的过程

线程:比进程更小的执行单位。一个进程在执行过程中,为了同时完成多项操作,可以产生多个线程,形成多条执行线索。每个线程都有它自身的产生、存在和消亡的过程

属于同一进程的所有线程共享该进程的系统资源

与进程不同的是线程本身即没有入口,也没有出口,其自身也不能独立运行,它栖身于某个进程之中,由进程启动运行,完成其任务后,自动终止,也可以由进程使之强制终止

 

为什么要使用多线程

1、       线程之间的切换速度比进程快,线程间的通信速度也快

2、       多个线程资源轮流抢占CPU资源时,使得CPU利用率提高

 

线程的调度

 

·       当有多于一个的线程工作时,在Java中,线程调度通常是抢占式(即哪一个线程先抢到CPU资源则先运行),而不是分时间片式。

·       一旦一个线程获得执行权,这个线程将持续运行下去,直到它运行结束或因为某种原因而阻塞,或者有另一个高优先级线程就绪(这种情况称为低优先级线程被高优先级线程所抢占)。

·       所有被阻塞的线程按次序排列,组成一个阻塞队列。例如:

·       因为需要等待一个较慢的外部设备,例如磁盘或用户。

·       让处于运行状态的线程调用Thread.sleep()方法。

·       让处于运行状态的线程调用另一个线程的join()方法。

·       所有就绪但没有运行的线程则根据其优先级排入一个就绪队列。

当CPU空闲时,如果就绪队列不空,就绪队列中第一个具有最高优先级的线程将运行。

当一个线程被抢占而停止运行时,它的运行态被改变并放到就绪队列的队尾;

一个被阻塞(可能因为睡眠或等待I/O设备)的线程就绪后通常也放到就绪队列的队尾。

线程调度按照优先级高低来执行,同样优先级按照先到先执行的原则

线程优先级的范围是1-10,1最小,10最大

Thread类定义了三个常数

MIN_PRIORITY     最低(小)优先级(值为1)

MAX_PRIORITY     最高(大)优先级(值为10)

NORM_PRIORITY    默认优先级(值为5)

线程创建是,继承父线程的优先级

 

主线程&多线程

主线程:每当一个application运行时,JVM会创建一个主线程,入口是main函数

多线程:在主线程中创建Thread的子类时,就创建了一个线程对象

 

线程的生命周期

新建:当一个Thread类或其子类被创建时,就处于新建状态,有了相应的内存空间和资源

就绪:调用start方法来启动线程,一旦轮到其享用CPU时,就可以开始自己的声明周期

运行:当就绪状态的线程被调度并获得处理器资源时,并进入运行状态

每一个 Thread类及其子类的对象都有一个重要的 run() 方法,叫做线程体,当线程对象被调用执行时,它将自动调用本对象的 run() 方法,从第一句开始顺序执行。Run( ) 方法定义了这个线程的操作和功能。当这个函数返回时,当前的线程结束

另外还有阻塞终止两个生命周期

 

创建线程

通常有两种办法创建新的线程:

·       创建一个Thread,或者一个Thread子类的对象;

·       创建一个实现Runnable接口的类的对象;

举个例子:

public classTest extendsThread {

   int pauseTime;

   Stringname;

   public Test(int x, String n){

      pauseTime = x;

      name = n;

   }

   public void run(){

      while(true){

         try{

            System.out.println("a Thread");

            Thread.sleep(pauseTime);

         }catch(Exception e){

            System.out.println(e);

         }

      }

   }

 

}

因为Java不允许多继承,所以其实implements接口Runnable是更常用的方式