1.什么是线程以及多线程与进程的区别
在现代操作在运行一个程序时,会为其创建一个进程。操作系统中调度的最小单位元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。因此我们可以这样理解:
进程: 正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。
线程: 是进程中的单个顺序控制流,是一条执行路径 一个进程如果只有一条执行路径,则称为单线程程序。 一个进程如果有多条执行路径,则称为多线程程序。
2.多线程的创建
创建多线程有三种方法,一种是继承Thread类重写run方法,另一种是实现Runnable接口重写run方法。还有一种是实现Callable接口,下面我们分别给出代码示例,
继承Thread类重写run方法
package com.test;
/**
1. @decrition 继承Thread实现线程
*/
public class Test extends Thread{
/**
* 重写run方法
*/
@Override
public void run() {
System.out.println("I'm a thread that extends Thread!");
}
}
实现Runnable接口重写run方法:
package com.test;
/**
2. @decrition 实现Runnable接口重写run方法
*/
public class RunnableTest implements Runnable{
/**
* 实现run方法
*/
@Override
public void run() {
System.out.println("I'm a thread that implements Runnable !");
}
}
3.多线程的启动
package com.test;
public class MainTest {
public static void main(String[] args) {
//继承Thread启动的方法
Test t1=new Test();
t1.start();//启动线程
//实现Runnable启动线程的方法
RunnableTest r = new RunnableTest();
Thread t2 =new Thread(r);
t2.start();//启动线程
}
}
运行结果
I'm a thread that extends Thread!
I'm a thread that implements Runnable !
4.线程生命周期与线程状态
新建状态(New):新创建了一个线程对象。
就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
等待阻塞(WAITING):运行的线程执行wait()方法,JVM会把该线程放入等待池中。
同步阻塞(Blocked):运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
超时阻塞(TIME_WAITING):运行的线程执行sleep(long)或join(long)方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期