JAVA学习第二十一课(多线程(一)初步了解)

放假在家,歇了好几天了,也没学习,今天学习一下多线程,找找感觉,后天就要回学校了,sad。。。

PS:包 没有什么技术含量,会用即可,日后开发就必须要会用啦,所以打算先放一放,先来多线程

一、多线程概述

什么是进程?

通俗的说,可以理解为正在进行中的程序,进程实际上是对应的一个应用程序在内存中所属空间。

进程不直接执行的,进程只是分配该应用程序需要的内存空间,线程来负责执行,线程负责进程中内容执行的一个控制单元,也称之为执行路径,也称之为执行情景

什么是线程?

线程就是进程中一个负责程序执行的控制单元(执行路径)

一个进程中可以有多个执行路径,叫做多线程

比如说:360中电脑体检在跑的同时垃圾清理也在跑

一个进程当中,至少要有一个线程

开启多个线程是为了同时运行多个部分的代码

每一个线程都有自己运行的内容,这个内容就可以称为线程要执行的任务

二、多线程的优点与弊端

看似多线程技术,高效,但是存在弊端。

Windows本身就是一个多任务同时运行的操作系统,比如Win在运行QQ和360,看似一边在聊QQ,360一边在扫描,他们是同时进行,实际上不是,CPU在负责程序的执行,在某一时刻,CPU正在控制QQ的运行,这时360就不会运行,CPU的切换速度非常快,所以感觉他们是在同时运行,实际上在某一个时刻,只有一个程序在运行,也就是只有一个路径在执行,所以当应用程序开的比较多的时候,就会比较卡,单个程序获取CPU的执行频率就少(PS:CPU的切换是随机的,依赖于时间片)

好处:解决多部分同时运行的问题

弊端:线程太多,就会导致效率的降低

所以,多线程技术虽然可以解决多程序同时运行的问题,但是程序开多了就会效率低下,甚至死机

当然即便CPU很强大,但是内存空间不足,同样做不到快速的切换动作

三、JVM中的多线程

虚拟机的启动,本身就依赖着多线程

JVM的启动就启动了多线程,至少有两个线程

1.执行main函数的线程(主线程)

该线程的任务代码都定义在main函数中

2.负责垃圾回收的线程(垃圾回收线程)

主线程在控制main的执行时,堆内存中存在多个垃圾,就会有另一线程去控制回收垃圾。

举例|:堆内存会产生很多对象,每个对象都存在被回收的可能,每个对象都不一样,有使用底层资源,有不是使用的,对象怎么被回收的只有对象自己清楚,所以每个对象都具备着能被回收的方法,那么每个对象都具备的方法就定义在Objectt类中,叫finalize,作用:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写finalize 方法,以配置系统资源或执行其他清除。

class Demo extends Object
{
	public void finalize()
	{
		System.out.println("Demo.finalize");
	}
}
public class Main
{
	public static void main(String[] args)
	{
		new Demo();
		new Demo();
		System.gc();//启动垃圾回收器
		System.out.println("hello word");
	}
}

PS:主线程执行到启动垃圾回收器时,垃圾回收线程启动,主线程会继续向下执行,所以先打印helloword,主线程结束,但是其他线程还在继续运行

四、主线程运行实例

对于堆内存并不是一产生垃圾就会回收,因为那样会与主线程争夺CPU的执行权,所以在某一时刻谁拿到执行权,谁执行

主线程->aDemo.show()进栈->执行完出栈->bDemo.show()进栈->执行完出栈->return

如果是下述代码

class Demo
{
	private String name;
	public Demo(String name)
	{
		// TODO Auto-generated constructor stub
		this.name = name;
	}
	public void show()
	{
		for(int i = 0;i<10;i++)
		{
			for(int j = -9999999;j<9999999;j++){}
			System.out.println(name+"i = "+i);
		}
	}
}
public class Main
{
	public static void main(String[] args)
	{
		Demo aDemo = new Demo("A");
		Demo bDemo = new Demo("B");
		aDemo.show();
		bDemo.show();
		System.out.println("hello word");
	}
}

这样程序会及其慢,而且A不执行完B就无法执行,那么如何实现A和B同时执行,那么就需要实现A在一个路径中,B在一个路径中,CPU进行切换,就可以实现A和B同时运行

就样就涉及到了多线程的创建。

时间: 2024-10-22 14:42:54

JAVA学习第二十一课(多线程(一)初步了解)的相关文章

JAVA学习第二十三课(多线程(二))- (多线程的创建方式二 :实现Runnable接口(常用))

当一个类有父亲,但是其中的功能还希望实现线程,那么就不能采用继承Thread的方式创建线程 那么就可以通过接口的方式完成 准备扩展Demo类的功能,让其中的内容可以作为线程的任务执行 实现Runnable接口,Runnable接口中只有一个方法run 一.创建线程的第二种方法 Runnable的出现仅仅是将线程的任务进行了对象的封装 /* * 创建线程的第二种方法 * 1.定义类实现Runnable接口 * 2.覆盖接口中的fun方法,将线程的任务代码封装到run方法中 * 3.通过Thread

JAVA学习第二十课(异常的应用和注意事项(三))

十.异常的应用 import java.util.Random; import javax.rmi.CORBA.Stub; /* *老师用电脑上课 *用面向对象思考问题 *问题设计两个对象 *老师,电脑 * *可能发生的问题: *电脑蓝屏.电脑冒烟 */ class Lan extends Exception//蓝屏 { Lan(String problem) { super(problem); } } class Fir extends Exception//冒烟 { Fir(String p

JAVA学习第十一课(继承)

继承:(extends) 很多类,但是有一些成员,都是重复的,所以为提供复用性,把重复的代码抽取出来,就应用了继承 1.提高了代码的复用性 2.让类与类之间产生了关系,继承给多态提供了前提,没继承就没多态 class MAN { String name; int age; } class student extends MAN //MAN是student的基类,student是MAN的子类 { void study() { System.out.println(name+"正在学习"+

Python第二十一课(反射/元类)

Python第二十一课(反射/元类)    >>>思维导图>>>中二青年 反射reflect 什么是反射, 其实是反省,自省的意思 反射指的是一个对象应该具备,可以检测,修改,增加自身属性的能力 反射就是通过字符串操作属性 涉及的四个函数,这四个函数就是普通的内置函数 没有双下划綫,与print等等没有区别 hasattr getattr setattr delattr p = Person("jack",18,"man") #

从.Net到Java学习第十一篇——SpringBoot登录实现

通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明啦!所以从这一篇开始我将会对之前自己做的.net项目用java来重写.这一篇,我们来现实登录模块. 一提到登录,我们首先想到的基本的功能点就有如下: 输入:用户名.密码.验证码. 登录成功后,跳转到后台.如果未登录直接访问后台,将会跳转到登录页面. 这里暂不考虑复杂的登录实现. 技术选型,沿用前面用到的知识点.那么这里较之于之前的文章,新用到的一个就是图片验证码,一个就

Linux学习第二节课(2019.9.7)

昨晚课程由于加班没有参加到上课,第二天补听了课程,再来写博客.第二节课,老刘跟我们第一章讲了如何安装虚拟机,安装linux系统,RPM和YUM仓库各种关系.然后老刘给我们讲一个"灰常恐怖的gui故事"来引入第二章的内容,讲述shell的作用,最后讲述了命令的长格式和短格式以及常用命令的ehco(echo 老刘真帅).date.reboot.poweroff.wget命令.目前还是能跟得上老刘的课程,要继续努力,复习预习,争取早日考过rhce. ---------------------

JAVA学习第二十四课(多线程(三))- 线程的同步

继续以卖票为例 一.线程安全问题的解决 同步的第一种表现形式:同步代码块 思路: 将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程是不允许参与运算的,必须要当期线程把代码执行完毕后,其他线程才可以参与运算 在java中用同步代码块解决这个问题 同步代码块格式: synchronized(对象) { 需要被同步的代码部分 } class Ticket implements Runnable { private int num = 100; Object god = ne

JAVA学习第二十二课(多线程(二))- (多线程的创建方式一 :继承Thread类)

线程是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写Thread 类的run 方法.另一种方法是声明实现 Runnable 接口的类.该类然后实现run 方法. 创建线程方式一:继承Thread类 一.创建线程的步骤: 1.定义一个类继承Thread类 2.覆盖Thread中的run()方法 3.直接创建Thread类子类的对象 4.调用start方法开启线程,并调用线程的任务run方法

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int