在我们学习java的线程时首先我们来了解两个两个概念:1.什么是进程 2.什么是线程
1.进程:程序是指令和数据的有序集合,它本身没有任何运行的含义,是个静态的概念而我们所说的进程是程序在处理机上的一次执行过程,它是一个动态的概念,他是一个具有独立的功能的程序,是一个实体,每一个进程都有自己的地址空间,简单来说,我们在计算机上打开一个我们编程用的eclipse编译软件,或者打开一个音乐播放器就是一个进程,进程在执行过程中由于CPU资源有限会有间断性,所以导致进程有3种状态:
1:就绪状态 :当进程已分配到除CPU以外的所有必要资源后,只要在获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。
2:运行状态 :进程已获得CPU,其程序正在执行。在单核CPU中,只有一个进程处于执行状态;再多核CPU中,则有多个进程处于执行状态
3:阻塞状态:正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。
下图是进程三种状态之间的关系
2.线程:线程实际上是在进程的基础上进一步划分,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。在一个进程启动后,进程中的若干个程序功能可划分为若干个线程,线程是进程的一个执行路径,同一个进程中的线程共享一个内存空间和进程中的所有资源,线程之间可以自由切换,并发执行,一个进程至少有一个线程(单线程程序),一个程序可以同时执行多个任务,用来提高效率如:通信中的同时多人聊天等。
接着我再另外介绍两个概念:3.并行 和 4.并发
3:什么是并行:并行是指在多核CPU中多个任务同时运行,例:吃饭的时候可以边吃饭边打电话,这两件事情可以同时执行,
4:什么是并发:是指两个或者多个任务同时请求执行,而处理器一次只能接受一个任务,就会把任务安排轮流交替执行,由于CPU时间片运行时间短,所以我们就有一种错觉就是感觉任务在同时执行,并发就如同我们:吃完饭->喝水 喝完水->睡觉 一觉醒来->吃饭......这么个过程
说了这么多了,我们开始进入线程:在java中创建一个线程有两种方式:
1:继承Thread类 ,执行run方法 然后通过当前类的对象用start()方法启动线程
2:实现Runnable接口:重写里面的run()方法,然后把当前类的对象作为一个事物传入Thread中最后通过Thread的对象调用start()方法启动。
下面我简单地运用这两个方式:继承Thread类的方式的测试代码如下
public class DamoThread extends Thread{
public void run() {
for(int i=0;i<20;i++){
System.out.println("i的值="+i);
};
}
public static void main(String[] args) {
DamoThread d=new DamoThread();
d.start();//启动线程
}
}
实现Runnable接口的方式:
public class DamoRunnabale implements Runnable {
public void run() {
for (int i = 0; i <20; i++) {
System.out.println("i的值="+i);
}
}
public static void main(String[] args) {
DamoRunnabale dr=new DamoRunnabale();
Thread t1=new Thread(dr);
t1.start();//启动线程
}
}
讲完线程的实现方式接着我们来讲讲线程的休眠:
5:线程的休眠;线程的休眠我们是通过调用Thread类中的一个sleep()的方法实现的在java的API中Thread类有一个public static void sleep(long millis)方法,throws interruptdeException使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),释放CPU的时间片,具体取决于系统定时器和调度程序的精度和准确性,线程不会丢失任何显示器的的所有权(对象锁不会释放),介绍两个异常:IllegalArgumentException---如果millis为负数会报的异常,nterruptdeException--如果任何线程中断当前线程,当抛出这个异常时,当前线程的中断状态会被清除。下面我们用程序来简单测试一下线程的休眠,我们在之前的基础上加一个sleep()方法,代码如下
public class DamoRunnabale implements Runnable {
public void run() {
for (int i = 0; i <20; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("i的值="+i);
}
}
public static void main(String[] args) {
DamoRunnabale dr=new DamoRunnabale();
Thread t1=new Thread(dr);
t1.start();//启动线程
}
}
先讲到这里,下一篇我们将和大家交流一下线程的中断,线程的同步和线程安全,欢迎各位大佬指点