Java 线程--继承java.lang.Thread类实现线程
现实生活中的很多事情是同时进行的,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类实现线程的更多相关文章
- Android(java)学习笔记62:继承Thread类创建线程类
package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...
- Android(java)学习笔记2:继承Thread类创建线程类
1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...
- java.lang.Thread类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)
CPU:10核 主频100MHz 1核 主频 3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- 【转】线程、Thread类和线程终止
一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...
- 用Thread类创建线程-2
支持原创,本系列文章均转自:http://www.blogjava.net/nokiaguy/category/38172.html 在Java中创建线程有两种方法:使用Thread类和使用Runna ...
- 用Thread类创建线程
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程, ...
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
随机推荐
- 4 个快速的 Python 编译器 for 2018
简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试. Python 其实是一种相当快的语言,但它并不像编译型语言那 ...
- 极光大数据告诉你,程序员们都在"愁"些啥?
有言道:隔行如隔山.面对不甚熟悉的人群和岗位,我们很容易在固有印象的干扰下,作出一些偏离实际的解读.比如在很多外行人眼中,程序员群体的固有形象是性格木讷,生活方式通常也比较宅.他们最大的爱好就是玩游戏 ...
- 发布 Android Library 到 JCenter 从入门到放弃
最近想倒腾一个小小的 UIKit 到 JCenter,为开源社区贡献一点绵薄之力,于是就有了一系列惨无人道的踩坑史.好,接下来,直奔主题,以下是发布流程. 发布到 JCenter 发布到 JCente ...
- 关闭tensorflow运行时的警告信息
执行简单的矩阵相乘的程序: import tensorflow as tf m1 = tf.constant([[3,3]]) m2 = tf.constant([[2],[3]]) product ...
- 2D激光SLAM算法比较+cartographer
Hector slam: Hector slam利用高斯牛顿方法解决scan-matching问题,对传感器要求较高. 缺点:需要雷达(LRS)的更新频率较高,测量噪声小.所以在制图过程中,需要rob ...
- vue 数据(data)赋值问题
总结一下我遇到的一个纠结很久的问题. 在项目中需要用到后台的数据对前端渲染,使用到了vue整合的axios,使用vue中的钩子函数在页面组件挂载完成之后向后台发送一个get请求然后将返回后的数据赋值d ...
- amqp模块在python2.7.6版本上报错的问题
机器的环境是python2.7.6; 使用pip install安装了amqp.正常安装,未报错. amqp安装的版本是2.1.4. 在python中,使用import amqp,报错如下: Trac ...
- Linux下配置redis,c#简单调用
redis比较流行的nosql库: 我这里测试本机window系统,虚拟机安装linux系统,linux系统部署redis,windwo系统,c#调用linux系统的redis 第一步:linux下安 ...
- python学习 条件控制
if - else if 条件a : 内容a else : 内容 非a if - elif - else if 条件a : 内容a elif 条件b: 内容b-a else : 内容 非(a∪b) ...
- 转 JSON在PHP中的基本应用
PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 该函数主要用来将数组和对象,转换为json格式.先看一个数组转换 ...