专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java多线程和线程池(上)创建和应用

temp10 2024-11-23 22:33:52 java教程 13 ℃ 0 评论

每天分享一点点,每天进步一点点!关注我,每期送出最新电子书及其他福利。

(1)文章开头,先聊聊几个基本的概念性问题:

Java多线程和线程池(上)创建和应用

  • 程序,进程,线程的基本概念+并行与并发:
  • 程序:是为完成特定任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象。
  • 进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,有它自身的产生,存在和消亡的过程。-------生命周期
  • 线程:进程可进一步细化为线程,是一个程序内部的一条执行路径


(2)线程的相关API

//获取当前线程的名字

Thread.currentThread().getName()


1.start():1.启动当前线程2.调用线程中的run方法

2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中

3.currentThread():静态方法,返回执行当前代码的线程

4.getName():获取当前线程的名字

5.setName():设置当前线程的名字

6.yield():主动释放当前线程的执行权

7.join():在线程中插入执行另一个线程,该线程被阻塞,直到插入执行的线程完全执行完毕以后,该线程才继续执行下去

8.stop():过时方法。当执行此方法时,强制结束当前线程。

9.sleep(long millitime):线程休眠一段时间

10.isAlive():判断当前线程是否存活



(3)线程的调度

调度策略:

时间片:线程的调度采用时间片轮转的方式

抢占式:高优先级的线程抢占CPU

Java的调度方法:

1.对于同优先级的线程组成先进先出队列(先到先服务),使用时间片策略

2.对高优先级,使用优先调度的抢占式策略


(4)线程的优先级

等级:

MAX_PRIORITY:10

MIN_PRIORITY:1

NORM_PRIORITY:5


(5)方法:

getPriority():返回线程优先级

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


注意!:高优先级的线程要抢占低优先级的线程的cpu的执行权。但是仅是从概率上来说的,高优先级的线程更有可能被执行。并不意味着只有高优先级的线程执行完以后,低优先级的线程才执行。


(6)多线程的创建方式

1. 方式1:继承于Thread类

1.创建一个集成于Thread类的子类 (通过ctrl+o(override)输入run查找run方法)

2.重写Thread类的run()方法

3.创建Thread子类的对象

4.通过此对象调用start()方法


start与run方法的区别:

start方法的作用:1.启动当前线程 2.调用当前线程的重写的run方法(在主线程中生成子线程,有两条线程)

调用start方法以后,一条路径代表一个线程,同时执行两线程时,因为时间片的轮换,所以执行过程随机分配,且一个线程对象只能调用一次start方法。

run方法的作用:在主线程中调用以后,直接在主线程一条线程中执行了该线程中run的方法。(调用线程中的run方法,只调用run方法,并不新开线程)


总结:我们不能通过run方法来新开一个线程,只能调用线程中重写的run方法(可以在线程中不断的调用run方法,但是不能开启子线程,即不能同时干几件事),start是开启线程,再调用方法(即默认开启一次线程,调用一次run方法,可以同时执行几件事)


(7)很经典的卖车票的示例


方式2:实现Runable接口方式

1.创建一个实现了Runable接口的类

2.实现类去实现Runnable中的抽象方法:run()

3.创建实现类的对象

4.将此对象作为参数传递到Thread类中的构造器中,创建Thread类的对象

5.通过Thread类的对象调用start()


具体操作,将一个类实现Runable接口,(插上接口一端)。

另外一端,通过实现类的对象与线程对象通过此Runable接口插上接口实现


比较创建线程的两种方式:

开发中,优先选择实现Runable接口的方式是因为:

1:实现的方式没有类的单继承性的局限性

2:实现的方式更适合用来处理多个线程有共享数据的情况

联系:Thread也是实现自Runable,两种方式都需要重写run()方法,将线程要执行的逻辑声明在run中

新增的两种创建多线程方式:

1.实现callable接口方式

与使用runnable方式相比,callable功能更强大些:

runnable重写的run方法不如callaalbe的call方法强大,call方法可以有返回值

方法可以抛出异常

支持泛型的返回值

需要借助FutureTask类,比如获取返回结果


2,使用线程池的方式:

背景:经常创建和销毁,使用量特别大的资源,比如并发情况下的线程,对性能影响很大。

思路:提前创建好多个线程,放入线程池之,使用时直接获取,使用完放回池中。可以避免频繁创建销毁,实现重复利用。类似生活中的公共交通工具。(数据库连接池)

好处:提高响应速度(减少了创建新线程的时间)

降低资源消耗(重复利用线程池中线程,不需要每次都创建)

便于线程管理

corePoolSize:核心池的大小

maximumPoolSize:最大线程数

keepAliveTime:线程没有任务时最多保持多长时间后会终止

。。。。。。


(8)JDK 5.0 起提供了线程池相关API:ExecutorService 和 Executors

ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor.

void execute(Runnable coommand):执行任务/命令,没有返回值,一般用来执行Runnable

Futuresubmit(Callable task):执行任务,有返回值,一般又来执行Callable

void shutdown():关闭连接池。


(9)线程池构造批量线程代码如下:



(10)JVM和线程之间的关系图



额外内容:

文末分享一份最新《Java面试汇总》给大家,关注并转发,私信我“面试”获取资源路径。仅代表个人,非培训机构。

最后祝2020各位程序大佬前程似锦。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表