Java-多线程基本方法

一.什么是进程
(一)线程和进程
要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的。
(二)进程概述
进程就是正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。
二.多线程的意义
多线程的作用不是提高执行速度,而是为了提高应用程序的使用率。
------那么怎么理解这个问题呢?
------我们程序在运行的使用,都是在抢CPU的时间片(执行权),如果是多线程的程序,那么在抢到CPU的执行权的概率应该比较单线程程序抢到的概率要大.那么也就是说,CPU在多线程程序中执行的时间要比单线程多,所以就提高了程序的使用率.但是即使是多线程程序,那么他们中的哪个线程能抢占到CPU的资源呢,这个是不确定的,所以多线程具有随机性.
三.什么是线程
在一个进程内部又可以执行多个任务,而这每一个任务我们就可以看成是一个线程。是程序使用CPU的基本单位。
四.并行和并发的区别
前者是逻辑上同时发生,指在某一个时间内同时运行多个程序。
后者是物理上同时发生,指在某一个时间点同时运行多个程序。
五.Java程序运行原理
Java命令会启动java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。
六.JVM的启动是多线程的吗
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
七.多线程程序实现的方式1
a.定义一个类,然后让该类继承Thread
b. 重写run()方法
c.创建a中定义的类的对象
d.启动线程(start方法)
(一)如何启动
我们启动线程使用不是run方法,而应该是start方法.使该线程开始执行;
Java 虚拟机调用该线程的 run 方法。
(二)重写run方法
这个类是一个线程类,那么在这个类中我们可不可以写一些其他的方法呢?
-------我们可以在写其他的方法,那么其他方法中封装的代码都是需要被我们线程执行的吗? 不一定
------ 那么也就是run方法中封装应该是必须被线程执行的代码.
------run方法中的代码的书写原则: 一般是比较耗时的代码
(三)案例演示
在这里插入图片描述
八.给线程取名和获取线程名字
(一)通过成员方法取名
String setName() 取名
String getName() 获取名字
在这里插入图片描述
Thread.currentThread() 获取当前线程对象
(二)通过构造函数
在这里插入图片描述
九.获取和设置线程优先级
(一)获取优先级
int getPriority() ;返回此线程的优先级。
(二)设置优先级
void setPriority(int newPriority) 更改此线程的优先级。
(三)案例
在这里插入图片描述
十.线程休眠
线程休眠: 让当前线程休眠指定的时间量
public static void sleep(long millis)
案例
在这里插入图片描述
案例:主线程休眠
在这里插入图片描述
void interrupt() 当线程调用wait(),sleep(long time)方法的时候处于阻塞状态,可以通过这个方法清除阻塞
案例
在这里插入图片描述
该线程并不会休眠100000ms,而是休眠状态被打断之后立马执行
十一.守护线程
什么是守护线程:将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。该方法必须在启动线程前调用。
void setDaemon(boolean on) //设置该线程为守护线程
案例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每次结果都不同,可以看出,每次非守护线程执行完之后,守护线程都能执行一会,不会立马退出虚拟机,这是因为延迟,执行多少由延迟大小决定。
十一.中断线程
void stop() ;本质上是不安全的,该方法已经过时
在这里插入图片描述
在这里插入图片描述
中断过后什么也没有打印
十二.多线程的实现方式2
a.定义一个类,让该类去实现runnable接口
b.重写run方法
c.创建a中定义的类的对象
d.创建Thread类的对象,把c中创建的对象当做参数传递进来
e.启动线程
在这里插入图片描述
在这里插入图片描述
十三.加入线程
public final void join ()//等待该线程执行完之后,才执行其他线程,在线程启动之后, 在调用方法

在这里插入图片描述
十四.礼让线程
礼让线程: public static void yield(): 暂停当前正在执行的线程对象,并执行其他线程。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图中可以看出在主方法中使用,在线程a打印到74的时候才去执行b线程,这是由于延迟的原因,一般要在你定义的类中使用才能立马见效。

猜你喜欢

转载自blog.csdn.net/PreyHard/article/details/84001161