关于Java中进程与线程的初步认识与掌握

来源:互联网 发布:斯凯网络 编辑:程序博客网 时间:2024/04/26 17:13

一.进程

1.定义:

官方对于进程的描述为:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

简单来说就是两句话(更易理解):一个正在运行的程序。 系统分配资源的最小单位。

2.状态:

进程一般来说有五个基本状态:进程状态分为五个基本状态,即初始状态,就绪状态,执行状态,等待状态(阻塞状态)与终止状态(死亡状态)。进程状态反映进程执行过程的变化,这些状态随着进程的执行和外界条件的变化而转换。

3.并发:

众所周知,计算机中运行程序和处理数据的核心为CPU,在今天,人们基本都在用单台拥有多个CPU的计算机,简称多核计算机(有些甚至高达八核)。虽然核越多理论上计算机运行速度会越快,但是并发执行的进程数目并不是由CPU数目制约的,而是操作系统将CPU的时间片段分配给每一个进程,由于计算机处理速度极快,所以给人以并行处理的感觉(实际上还是一个一个的处理)。

二.线程

1.定义:

官方对于线程的描述为:一个程序可以执行多个任务,通常,每一个任务称为一个线程(thread),它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序(multithreaded)。

我对于线程简单的理解为:CPU调度的最小单位(代码运行的一条路径)。

2使用方法:

在Java中创建线程可以有两个方式,继承(extends)Thread类或者继承(implements)Runnable接口。

以下我只简单的说明一下Thread的用法(其余请自行了解)。Thread类中只有一个run()方法用来重写,在run()方法中写线程需要执行的代码。然后在主程序中创建对象,启动线程即可,切记开始线程必须要用start()的方法,直接调用run()方法是不能开始线程的。以下代码是我自己写的一个很方便理解线程使用还有主线程和分线程的关系:

public class CountThread extends Thread {String flag;public CountThread(String flag){//从外部传一个参数进入run(),利用构造函数实现(构造函数没有void)this.flag=flag;//设置一个分线程标签}@Overridepublic void run(){//每隔一秒打印一个累加的数字int count=0;while(true){System.out.println("分线程"+flag+" count"+count);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}count++;}}public static void main(String[] args) {CountThread ct1=new CountThread("1");ct1.start();//不可用ct1.run(),那是调用方法,不是开始线程,开始线程只能用start()CountThread ct2=new CountThread("2");ct2.start();System.out.println("我是主线程!");}}

三.多进程与多线程的区别

二者的本质区别在于每个进程拥有自己的一整套变量,而线程则共享数据,这听起来似乎有些风险,的确也是这样。然而,共享变量使线程之间的通信比进程之间的通信更有效,更容易。除此之外,在有些操作系统中,与进程相比较,线程更“轻量级”,创建、撤销一个线程要比启动一个新进程的开销要小得多。

当然,在实际应用中,多线程也非常有用。例如:一个浏览器可以同时下载几幅图片、一个web服务器需要同时处理几个并发的请求、图形用户界面(GUI)程序用一个独立的线程从宿主环境中收集用户界面的事件等等。

原创粉丝点击