• java学习之线程


    一、线程总述:

      线程是java当中一个重要的内容,如果想说线程的话,那我们应该先来讲一下什么是进程。

      进程:那么什么是进程呢,进程从字面上来理解就是,正在进行的程序。就比如说我们在windows当中打开任务管理器之后,我们看到的一个个程序一样。这个程序是在内存当中运行的,我们也可以说,进程就是对应在内存当中该程序所开辟的内存空间。在程序当中程序并不是负责程序执行的,实际上真正执行的是线程也叫做执行路径,从上往下执行,进程只是负责分配内存空间。

      线程:就是程序当中中,负责程序执行的控制单元,也叫做执行路径。一个进程当中可以有多个执行路径,称之为多线程。一个进程当中,至少要有一个线程。多线程的一个示例就是:360同时电脑扫描的时候,也在清理垃圾,也在扫描病毒。开启多个线程是为了同时执行部分。每个线程都有自己的运行内容,这个运行内容就是这个线程的任务。

      多线程的好处:解决了多个部分同时运行的问题。

      多线程的弊端:线程太多会导致效率过低。

      其实应用程序的执行都是在cpu上做着快速切换完成的,这个切换是随机的。

      线程的停止是由于JVM退出造成的,并不是由于主线程的退出而造成的。

      JVM启动的时候,就启动了多个线程,至少有两个由分析得:

      1、负责执行main函数的线程

         定义在main函数内----任务

      2、负责回收垃圾的线程

         在垃圾回收器当中进行的

     多线程示例一:垃圾回收器:

      

     1 class Demo extends Object
     2 {
     3 
     4     /**
     5     *覆写了Object当中的finalize方法,来改变回收垃圾时索要执行的动作
     6     */
     7     public void finalize()
     8     {
     9 
    10         System.out.println("Hello Finalize!");
    11 
    12     }
    13     
    14 }
    15 
    16 class ThreadDemo1
    17 {
    18 
    19     public static void main(String[] args) {
    20         
    21         new Demo();
    22         new Demo();
    23         new Demo();
    24         new Demo();
    25         System.gc();//调用系统当中定义的gc方法来回收垃圾
    26         new Demo();
    27         new Demo();
    28         new Demo();
    29         System.out.println("Hello World!!!");
    30 
    31     }
    32 
    33 }

    但是输出的结果是两种的:

    在程序运行的时候,当调用gc方法之后尽心了垃圾的回收清除,在回收垃圾的时候就调用了finalize这个方法。

    为了避免大家误解,就是说必须main这个线程执行完了之后,才执行gc的线程,这里把代码来修改一下:

     1 class ThreadDemo1
     2 {
     3 
     4     public static void main(String[] args) {
     5         
     6         new Demo();
     7         new Demo();
     8         new Demo();
     9         new Demo();
    10         new Demo();
    11         new Demo();
    12         new Demo();
    13         new Demo();
    14         new Demo();
    15         new Demo();
    16         new Demo();
    17         new Demo();
    18         new Demo();
    19         new Demo();
    20         for(int i = 0; i<100000000; i++){}
    21         for(int i = 0; i<100000000; i++){}
    22         for(int i = 0; i<100000000; i++){}
    23         for(int i = 0; i<100000000; i++){}
    24         for(int i = 0; i<100000000; i++){}
    25                             
    26         System.gc();
    27         new Demo();
    28         new Demo();
    29         new Demo();for(int i = 0; i<100000000; i++){}
    30         System.out.println("Hello World!!!");
    31 
    32     }
    33 
    34 }

    这里的输出结果是:

    这里我们可以看出来,在创建完对象之后,就开始回收垃圾了。并不是执行完main函数之后才执行gc()这个方法的.那么为什么会出现之前的那种状况呢,因为通知JVM启动回收线程也是需要时间的。在这个时间内就已经执行输出了 HelloWorld 了。

  • 相关阅读:
    mysql基础整理01
    继承、接口、static、abstract
    重载与重写
    单例模式
    我的程序人生
    Idea的Maven项目引入模块
    测试单元测试完毕关闭jvm
    java线程
    logback日志的美化
    Netty中消除开始的日志消息修改日志级别
  • 原文地址:https://www.cnblogs.com/sunchuanzhen/p/3375021.html
Copyright © 2020-2023  润新知