在学习java线程编程前,我们需要了解线程的概率,区分线程和进程的区别,最后介绍java中创建线程的两种方式。下面将逐一带你来了解这些基础知识
什么是进程?
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程的概念主要有两点:
第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
进程主要特征
(1)动态性
进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的;
(2)并发性
任何进程都可以同其他进程一起并发执行;
(3)独立性
进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
(4)异步性
由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进;
(5)结构特征
进程由程序、数据和进程控制块三部分组成;
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
什么是线程?
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
Java中怎样实现线程?
在Java中,实现线程存在两种方式,分别如下:
继承java.lang.Thread类
直接继承Thread类,然后重写run方法,最后通过new创建该类的一个实例,然后通过start方法来启动,代码如下:public class MyThread {
public static void main(String[] args) {
// 创建自己线程对象
MyThreadInner myThread = new MyThreadInner();
// 启动线程
myThread .start();
}
}
// 自己的线程类
class MyThreadInner extends Thread{
// 需要覆盖的方法
@Override
public void run() {
for (int i=0; i<30; i++) {
System.out.println(i);
}
}
}
实现Runnable接口
通过实现Runnable接口,然后实现run方法,使用该接口实现类的实例来创建一个Thread对象,然后使用start方法来启动线程。代码如下:public class MyThread {
public static void main(String[] args) {
MyThreadInner myH = new MyThreadInner();
new Thread(myH).start();
}
}
class MyThreadInner implements Runnable{
@Override
public void run() {
for (int i=0; i<30; i++) {
System.out.println(i);
}
}
}
在使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。一旦创建一个新的线程,就产生一个新的调用栈。线程总体分两类:用户线程和守候线程。当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的。