Java基础第十八天总结——多线程

目录:

1、基本概念:程序、进程、线程

2、线程的创建和使用

/*------------------分割线----------------------*/

一、基本概念:程序、进程、线程

程序:一段静态代码,静态对象

进程:正在运行的一个程序,是一个动态的过程,是有声明周期的。

线程:进程的进一步细化,是程序内部的一条执行路径。若同一时间并行执行多个线程,就是支持多线程的。

每个线程拥有独立的运行栈和程序计数器(pc),线程切换开销小。

一个进程中多个线程共享相同的内存单元/内存地址空间。

一个Java应用程序至少有三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。如果发生异常,会影响主线程。

并行与并发:

并行:多个cpu同时执行多个任务

并发:一个cpu同时执行多个任务

多线程的有点:

1.提高应用程序的相应。增强用户体验。

2.提高cpu利用率。

3.改善程序结构。

何时需要多线程:

程序需要同时执行2个或多个任务

程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等

需要一些后台运行的程序时。

二、线程的创建和使用

Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现

Thread类的特性:

每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体

通过该Thread对象的start()方法来启动这个线程,而非直接调用run()

Thread类

构造器

Thread():创建新的Thread对象

Thread(String threadname):创建线程并指定线程实例名

Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法

Thread(Runnable target,String name):创建新的Thread对象

API中创建线程的两种方式:

JDK1.5前2种:

继承Thread类的方式

实现Runnable接口的方式

方式一:继承Thread类

定义子类继承Thread类

class HelloThread extends Thread{}

子类中重写Thread类中的run方法

创建Thread子类对象,即创建了线程对象

调用线程对象start方法:启动线程,调用run方法

 注意点:

1.如果手动调用run()方法,那么就是普通方法,没有启动多线程。

2.run()方法由JVM调用,什么时候调用,执行过程控制都是由OS的CPU调度觉定

3.要启动多线程,必须调用start方法

4.一个线程对象只能调用一次start()方法启动,如果重复,则将抛出以上的异常“|IIegalThreadStartException”

方式二:实现Runnable接口

1.定义子类,实现Runnable接口

2.子类重写Runnable接口中run方法

3.通过Thread类含参构造器创建线程对象

4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中

5.调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法

继承方法和实现方法的联系和区别

public class Thread extends Object implements Runnable

区别:

继承Thread:线程代码存放在Thread子类run方法中

实现Runnable:线程代码存放在接口子类的run方法中

实现方法的好处:

避免了单继承的局限性

多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源

Thread类的有关方法

void start():启动线程,并执行对象的run方法

run():线程在被调度时执行的操作

String getName():返回线程的名称

void setName():设置该线程名称

static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类

static void yield():线程让步

join():当某个程序执行流中调用其他线程的join()方法时,调用现场将被阻塞,直到join()方法加入join线程执行完为止

static void sleep(long millis):(指定时间:毫秒)

stop():强制线程声明结束

boolean isAlive():返回boolean,判断线程是否还存活

线程的调度

 

线程的优先等级

>MAX_PRIORITY:10

>MIN_PRIORITY:1

>NORM_PRIORITY:5

涉及的方法:

>getPriority:返回线程优先值

>setPriority(int newPriority):改变线程优先级

说明:

线程创建时继承父线程的优先级

低优先级只能获得调度的概率低,并非一定是高优先级线程之后才被调用

补充:线程的分类

Java中线程分两类:守护线程、用户线程

它们几乎在每个方面都是相同的,唯一区别是判断JVM何时离开

守护线程是用来服务用户线程的,通过start方法前调用thread.setDaemon(true)可以吧一个用户线程编程一个守护线程

gc就是一个典型的守护线程

JVM中都是守护线程,当前JVM将退出

形象理解:兔死狗烹,鸟尽弓藏

猜你喜欢

转载自www.cnblogs.com/zhoutie170821/p/11984363.html