一、进程与线程基本概念
进程:进程是程序的一次动态执行过程,它经历了从代码加载,执行到执行完毕的一整个过程;
线程:线程可以看作是轻量级的进程,是进程中负责程序执行的执行单元,本身依靠程序而运行;
二、线程的生命周期
图片来自:Java多线程
线程共有五种基本状态:
新建态(New):刚创建的线程对象处于新建态;
就绪态(Runnable):线程对象调用Thread类中的start()方法,线程进入就绪态,做好执行准备,等待CPU的调度;
运行态(Running):CPU调用处于就绪态的线程,线程开始执行,进入运行状态,处于其他状态的线程必须先转换为就绪态后才能进入到运行状态;
阻塞态(Blocked):处于运行态的线程因为某些原因停止执行,进入阻塞态;
死亡态(Dead):线程执行完毕或强行退出,生命周期结束;
三、线程的实现方式
1、继承Thread类
1 class MyThread extends Thread{ 2 private String name ; 3 public MyThread(String name){ 4 this.name = name; 5 } 6 @Override 7 public void run() { 8 for(int i = 0 ; i<100 ; i++){ 9 System.out.println(this.name + "--------->"+i); 10 } 11 } 12 }
启动线程要使用Thread类中的start()方法而不是调用run()方法,run()方法用来定义线程的运行体,若直接调用run()方法,相当于在main()线程中执行run()方法,并没有创建新的线程,使用start()方法启动线程是通过JVM调用run()方法,会创建一个新的线程;
注:一个线程只能调用一次start()方法(只能启动一次),若调用多次会出现异常:java.lang.IllegalThreadStateException
2、实现Runnable接口
1 package com.thread; 2 3 class MyThread implements Runnable{ 4 private String name ; 5 public MyThread(String name){ 6 this.name = name; 7 } 8 @Override 9 public void run() { 10 for(int i = 0 ; i<100 ; i++){ 11 System.out.println(this.name + "--------->"+i); 12 } 13 } 14 } 15 16 public class ThreadDemo { 17 public static void main(String[] args) { 18 MyThread mt = new MyThread("这是一个线程A:"); 19 new Thread(mt).start(); 20 // Thread t1 = new Thread(mt); 21 // t1.start(); 22 new Thread(mt).start(); 23 // Thread t2 = new Thread(mt); 24 // t2.start(); 25 26 } 27 }
Runable接口中只有run()方法,继承Runnable接口实现多线程必须通过Thread类来启动start()方法,也就是将实现了Runnable接口类的实例传入Thread创建新的线程,再调用start()方法;
四、线程命名与取得
Thread类中提供了setName()、getName()方法为线程命名或取得线程名称;
|- 线程命名:public final String getName();
|- 取得命名:public final void setName(String name);
|- 返回当前正在执行对象的引用:public static Thread currentThread();
1 package com.thread; 2 3 class MyThread implements Runnable{ 4 @Override 5 public void run() { 6 for(int i = 0 ; i<50 ; i++){ 7 System.out.println(Thread.currentThread().getName() + "--------->"+i); 8 } 9 } 10 } 11 12 public class ThreadDemo { 13 public static void main(String[] args) { 14 MyThread mt = new MyThread(); 15 new Thread(mt,"线程A").start(); 16 new Thread(mt,"线程B").start(); 17 Thread t = new Thread(mt); 18 t.setName("线程C"); 19 t.start(); 20 21 } 22 }