zoukankan      html  css  js  c++  java
  • 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同一时候运行

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

  • 相关阅读:
    js的style.width取不到元素的宽度值
    git bush 无法使用箭头进行选择
    exports module.exports export export default之间的关系
    vue前端项目中excel文件下载
    vue -- router路由跳转错误 , NavigationDuplicated
    node url模块
    SSO CAS 单点系列
    离线电脑搭建开发环境
    Shader的语法
    NavMesh名字、层索引、层值之间的转换
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6898438.html
Copyright © 2011-2022 走看看