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