您的位置:首页 > 编程语言 > Java开发

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

2014-10-04 22:17 309 查看
放假在家,歇了好几天了,也没学习,今天学习一下多线程,找找感觉,后天就要回学校了,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同时运行

就样就涉及到了多线程的创建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: