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 了。

原文地址:https://www.cnblogs.com/sunchuanzhen/p/3375021.html