【JAVA基础】如何通俗的理解多线程

来源:互联网 发布:秦丝软件 编辑:程序博客网 时间:2024/06/06 10:53

1、进程

一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径或者叫一个控制单元。

2、线程

进程中的一个负责程序执行的控制单元,一个进程中可以多执行路径,称之为多线程。线程在控制着进程的执行。一个进程中至少有一个线程。

3、线程状态


(1)新建状态:新创建了一个线程对象

(2)就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行,等待获取CPU的使用权

(3)运行状态:就绪状态的线程获取了CPU,执行程序代码

(4)阻塞状态:阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。知道线程进入就绪状态,才有机会转到运行状态

4、创建线程的两种方式

(1)第一种方式:继承Thread类

步骤:

1、定义类继承Thread

2、复写Thread类中的run方法

3、调用线程的start方法(该方法两个作用:启动线程,调用run方法)

class Demo extends Thread{private String name;Demo(String name){super(name);//this.name = name;}public void run(){for(int x=0; x<10; x++){//for(int y=-9999999; y<999999999; y++){}System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName());}}}class ThreadDemo2 {public static void main(String[] args) {/*创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。而运行的指定代码就是这个执行路径的任务。jvm创建的主线程的任务都定义在了主函数中。而自定义的线程它的任务在哪儿呢?Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。这个任务就通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数。run方法中定义就是线程要运行的任务代码。开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。将运行的代码定义在run方法中即可。 */////Thread t1 = new Thread();Demo d1 = new Demo("旺财");Demo d2 = new Demo("xiaoqiang");d1.start();//开启线程,调用run方法。d2.start();System.out.println("over...."+Thread.currentThread().getName());}}

(2)第二种方式:实现Runnable

步骤:

1、定义类实现Runnable接口

2、覆盖Runable接口中的方法

3、通过Thread类建立线程对象

4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数

5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

class Thread2 implements Runnable{      private String name;        public Thread2(String name) {          this.name=name;      }        @Override      public void run() {            for (int i = 0; i < 5; i++) {                  System.out.println(name + "运行  :  " + i);                  try {                      Thread.sleep((int) Math.random() * 10);                  } catch (InterruptedException e) {                      e.printStackTrace();                  }              }                }        }  public class Main {        public static void main(String[] args) {          new Thread(new Thread2("C")).start();          new Thread(new Thread2("D")).start();      }    }  

(3)实现Runnable接口比继承Thread类所具有的优势与区别

优势:

适合多个相同的程序代码的线程去处理同一个资源;

可以避免java中的单继承限制;

增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

线程池只能放入实现Runnable或者callable类线程,不能直接放入继承Thread的类

区别:

继承Thread:线程代码存放Thread子类的run 方法中

实现Runnable:线程代码存放在接口的子类的run方法


实际上所有的多线程代码都是通过Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础


原创粉丝点击