鹅鹅鹅知识点之-多线程问题-003

1什么是进程和线程:

进程是程序的一次动态执行的过程,;对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程;

线程是比进程更小的执行单位,也是最小的执行单元。线程是在进程的基础上进行的进一步划分。一个进程可以包括多个线程,一个进程至少包含一个线程;

如何调度进程和线程,完全由操作系统决定;

例如我们打开一个word,这时候就是启动了一个进程, 在编辑的时候,如果英文拼写,写错了,会有红线的提示,(也就是拼写检查),这就是一个线程,这个时候还会有打字,打印等其他线程。

我看一篇博客上,有这样一个类比,觉得挺恰当:

把计算机的核心是CPU,类比成一个供电站;

电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工;任一时刻,CPU总是运行一个进程,其他进程处于非运行状态;

进程就好比工厂的一个车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态;

线程就好比一个车间里的工人。一个进程可以包括多个线程。车间的空间是工人们共享的,这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存和资源。

2:什么叫做多任务

简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。

2-1:单核cpu如何执行多任务:

即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的。

操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

2-2:真正的并行执行多任务只能在多核CPU上实现;

由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

12-3:实现多任务的模式:

·
多进程模式;

多线程模式;

多进程+多线程模式

2:什么是多线程?为什么要用多线程?多线程的实现方式?

2-1什么是多线程:

多线程就是指一个进程中同时有多个执行路径(线程)正在执行。

2-2为什么要用多线程?

a.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。

b.可以提高程序的效率。

c.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

缺点:
a.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
b.影响系统性能,因为操作系统需要在线程之间来回切换。
c.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。
d.线程使用不当会发生很多问题。

2-3多线程的实现方式?

第一种:继承java.lang包种的Thread类,重写run方法(启动时需要调用start方法)

第二种:.实现Runnable接口,重写run方法,(这个时候启动线程还是还是需要调用start()方法,这个时候就需要借助Thread类的干燥方法)实现Runnable接口的实现类的实例对象作为Thread构造函数的target

第三种:通过Callable(JDK1.5追加的java.util.concurrent中的一个新接口)和FutureTask创建线程

在这里插入图片描述
在这里插入图片描述

·
4通过线程池创建线程

java.util.concurrent.ExecutorService;

3:为什么启动线程不直接调用run()方法,而是调用start()方法?

因为线程的运行需要本地操作系统的支持;

Start()方法类Thread类中的定义,start0()方法,这个方法在声明处使用了native关键字声明,native关键字表示调用本机的操作系统函数,在不同操作系统中的多线程的底层实现不同,native关键字也可以让JVM自动调整不同JVM实现。

而且只能调用一次start()方法,如果调用多次,则会抛出Illegal ThreadException 异常。

4:Java程序每次运行至少启动几个线程?

因为Java是多线程的编程语言,所以Java程序运行时也是以线程的方式运行的,主方法至少也就是一个线程;

当使用Java命令执行一个类时,实际上就会启动一个JVM,每个JVM实际上就是在操作系统中启动了一个线程,Java本身具备了垃圾回收机制,所以在Java运行时至少启动两个线程,一个是main线程,一个是垃圾收集线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值