现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制。先来看线程的基本概念。

线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别:

1.每个进程是一个应用程序,都有独立的内存空间。

2.同一个进程中的线程共享其进程中的内存和资源。

(共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的栈内存)

我们还需要了解以下基本内容:

1.什么是进程?

一个进程对应一个应用程序。例如:在Windows操作系统启动word就表示启动了一个进程。在Java开发环境下启动JVM,就表示启动了一个进程。现在的计算机都是支持多进程的,在同一个操作系统中,可以同时启动多个进程。

2.多进程有什么作用?

单进程计算机只能做一件事情。

玩电脑,一边打游戏(游戏进程)一边听音乐(音乐进程)。

对于单核计算机来讲,在同一个时间点上,游戏进程和音乐进程是在同时运行吗?   不是。

因为计算机的CPU只能在某个时间点上做一件事情。由于计算机将在“游戏进程”和“音乐进程”之间频繁地切换执行,切换速度极高,人类感觉游戏和音乐同时在进行。

多进程的作用不是提高执行速度,而是提高CPU的使用率。

进程和进程之间的内存是独立的。

3.什么是线程?

线程是一个进程中的执行场景。一个进程可以启动多个线程。

4.多线程有什么作用?

多线程不是为了提高执行速度,而是提高应用程序的使用率。

线程和线程共享“堆内存和方法区内存”,栈内存是独立的,一个线程一个栈。

5.Java程序的运行原理?

Java命令会启动Java虚拟机,启动JVM,等于启动了一个进程,该进程会自动启动一个“主线程”,然后主线程去调用某个类的main方法,所以main方法运行在主线程中。在此之前的所有程序都是单线程的。

理论知识有了,接下来试着分析以下程序有几个线程?

public class ThreadTest01{
 public static void main(String[] args){
   m1();
 }
 public static void m1(){    
   m2();
 }
 public static void m2(){
   m3();
 }
 public static void m3(){
   System.out.println("asfs");
 }
}

上面程序只有一个线程,就是主线程。main()方法调m1();m1()调m2();m2()调m3(),所以main()方法以及m1();m2();m3();方法在同一个栈中。由于进程与进程的栈是独立的,所以只有一个进程。

在Java中实现线程的两种方式,分别为继承java.lang.Thread类与实现java.lang.Runnable接口。先来看第一种实现方式。

第一步:继承java.lang.Thread;

第二步:重写run方法。

具体过程看以下代码。

public class ThreadTest02{
 public static void main(String[] args){
   //创建线程(多态:父类型引用指向子类型对象)
   Thread t=new Processor();
   //启动
   t.start();  
   for(int j=0;j<10;j++){
     System.out.println("main--->"+j);
   }
 }
}
//自定义一个线程
class Processor extends Thread{
 //重写run方法
 public void run(){
   for(int i=0;i<100;i++){
     System.out.println("run--->"+i);
   }
 }
}

继承类java.lang.Thread;方式实现线程主要分为三步,1.自定义一个线程; 2.创建线程; 3.启动线程;

通过下面这张图来看JVM的工作原理。

在上面的代码中,

1.首先自定义线程Processor, 创建线程Thread t=new Processor();属于多态,即父类型引用指向子类型对象。

2.启动线程。t.start(); 这段线程执行瞬间结束,告诉JVM再分配一个栈给t线程。而且run方法不需要程序员手动调用,系统线程启动之后自动调用run方法。

3.以上这个程序有两个线程,一个主线程,一个自定义线程。有了多线程之后,main方法结束只是主线程栈中没有方法栈帧了。但是其他栈中还有栈帧。main方法结束,程序可能还在执行。

4.如果只是使用普通方法调用run方法,即t.run(); 则只有一个线程,run方法只要还没结束,紧跟着的for循环就不会执行。

wx搜索“程序员考拉”,专注java领域,一个伴你成长的公众号!

Java 线程--继承java.lang.Thread类实现线程的更多相关文章

  1. Android(java)学习笔记62:继承Thread类创建线程类

    package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...

  2. Android(java)学习笔记2:继承Thread类创建线程类

    1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...

  3. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  4. java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)

    CPU:10核 主频100MHz 1核  主频    3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...

  5. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  6. 【转】线程、Thread类和线程终止

    一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...

  7. 用Thread类创建线程-2

    支持原创,本系列文章均转自:http://www.blogjava.net/nokiaguy/category/38172.html 在Java中创建线程有两种方法:使用Thread类和使用Runna ...

  8. 用Thread类创建线程

    在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程, ...

  9. [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

随机推荐

  1. [Swift实际操作]八、实用进阶-(5)通过间接代理进行对象间的消息传递

    本文将为你演示,如何通过简介代理的方式,进行对象间的消息传递在左侧的项目导航区,打开自定义视图的代码文件(CustomView.swift). import UIKit class CustomVie ...

  2. ubuntu和centos安装docker

    一. UBUNTU系统上 1. 卸载旧版本(新系统不用执行) sudo apt-get remove docker docker-engine docker.io     2. 安装docker st ...

  3. CH2401 送礼物(双向dfs)

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  4. java类的基本结构

    对象依赖于类存在. 分析过程先有对象后有类,开发过程中先有类后有对象. new是为新建对象开辟内存空间的运算符:以类为模板,开辟空间实例化一个对象,并返回该对象的一个引用. 成员变量 直接在类中定义 ...

  5. POJ3321 Apple Tree (JAVA)

    树形数组题,有一定难度. 首先得搞清楚树形数组是什么 - 它是建立在原始数组上的统计数组 - 目的:方便对原始数组进行切片统计,主要用于统计切片的累加和 其实你可以对切片进行扫描,把元素一个一个加起来 ...

  6. Kafka:Consumer

    1.预览 1.1 消费者组(Consumer Group) 一个consumer group可能有若干个consumer实例 同一个group里面,topic的每条信息只能被发送到group下的一个c ...

  7. C#集合之不变的集合

    如果对象可以改变其状态,就很难在多个同时运行的任务中使用.这些集合必须同步.如果对象不能改变器状态,就很容易在多个线程中使用. Microsoft提供了一个新的集合库:Microsoft Immuta ...

  8. 怎么搭建vue-cli脚手架

    我们在使用vue搭建项目的时候,经常要使用到vue-cli. 一.安装node.js 去node官网下载并安装node,一直next就行. 等待安装完毕,输入node-v,如果输出版本号,那说明已经成 ...

  9. BellmanFord贝尔曼-福特算法

    import java.util.ArrayList; import java.util.Scanner; /** * 贝尔曼-福特算法 * * Bellman - ford算法是求含负权图的单源最短 ...

  10. WinForm GDI编程:Graphics画布类

    命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using System.Drawing.Drawing2D;//提供高级的二维和矢量图像功能 using ...