Java

您所在的位置:网站首页 多线程的特点 Java

Java

#Java | 来源: 网络整理| 查看: 265

(一)目录  多线程介绍 线程的创建 线程的使用 线程的优先级 守护线程 线程同步 线程并发协作

(二)多线程介绍  1.多线程的基本概念 程序    “程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件,比 如:我们要启动网易云听音乐,则需要执行网易云对应的的可执行程序。当我们双击网易云的可执行程序后操作系统会将该程序加载到内存中,开始执行该程序,于是产生了“进程”。 进程        执行中的程序叫做进程(Process),是一个动态的概念。其实进程就是一个在内存中独 立运行的程序空间 。如正在运行的写字板程序就是一个进程。    

 进程是程序的一次动态执行过程, 占用特定的地址空间。

 每个进程由 3 部分组成:cpu、data、code。每个进程都是独立的,保有自 己的 cpu 时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这 3 样东西,这样的缺点是:浪费内存,cpu 的负担较重。

多任务(Multitasking)操作系统将 CPU 时间动态地划分给每个进程,操作系统同时执行多个进程,每个进程独立运行。以进程的观点来看,它会以为自己独占 CPU 的使用权。 进程的查看 :Windows 系统: Ctrl+Alt+Del,启动任务管理器即可查看所有进程。 

线程

    一个进程可以产生多个线程。同多个进程可以共享操作系统的某些资源一样,同一进程

的多个线程也可以共享此进程的某些资源(比如:代码、数据),所以线程又被称为轻量级 进程(lightweight process)。

 一个进程内部的一个执行单元,它是程序中的一个单一的顺序控制流程。

 一个进程可拥有多个并行的(concurrent)线程。

一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。

由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制, 这就使得通信更简便而且信息传递的速度也更快。 线程的启动、中断、消亡,消耗的资源非常少。

2.线程和进程的区别

 线程在进程中运行的。

 一个进程可以包含多个线程。

不同进程间数据很难共享,而同一进程下不同线程间数据很易共享。

 进程要比线程消耗更多的计算机资源。

进程间不会相互影响,因为它们的空间是完全隔离的。而进程中的一个线程挂掉将导致整个进程挂掉。

进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。 一个进程如果只有一个线程则可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。

3 并发

      并发是指在一段时间内同时做多个事情。当有多个线程在运行时,如果只有一个 CPU,这种情况下计算机操作系统会采用并发技术实现并发运行,具体做法是采用“ 时间片轮询算法”,在一个时间段的线程代码运行时,其它线程处于就绪状。这种方式我们称之为并发(Concurrent)。

4 线程的执行特点 4.1 方法的执行特点

 4.2线程的执行特点

5  主线程以及子线程 5.1 主线程         当 Java 程序启动时,一个线程会立刻运行,该线程通常叫做程序的主线程( main thread ), 即 main 方法对应的线程,它是程序开始时就执行的。        Java 应用程序会有一个 main 方法,是作为某个类的方法出现的。当程序启动时,该方法就会第一个自动的得到执行,并成为程序的主线程。也就是说,main 方法是一个应用的入口,也代表了这个应用的主线程。 JVM 在执行 main 方法时 ,main 方法会进入到栈内存 ,JVM会通过操作系统开辟一条 main 方法通向 cpu 的执行路径 ,cpu 就可以通过这个路径来执行main 方法 , 而这个路径有一个名字 , 叫 main( 主 ) 线程。 主线程的特点:     它是产生其他子线程的线程。它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行。 5.2 子线程     在主线程中创建并启动的线程,一般称之为子线程。 (四)创建线程 在 Java 中使用多线程非常简单,我们先学习如何创建线程,然后再结合案例深入剖析 线程的特性。 1 通过继承 Thread 类实现多线程 在 Java 中负责实现线程功能的类是 java.lang.Thread 类。 继承 Thread 类实现多线程的步骤: ①继承 Thread 类定义线程类。 ②重写 Thread 类中的 run( )方法。run( )方法也称为线程体。 ③ 实例化线程类并通过 start()方法启动线程。   public class TestThread extends Thread { public TestThread(){ System.out.println(this.getName()); } /** * 线程的线程体 */ @Override public void run() { System.out.println(this.getName()+"线程开始"); for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3