| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> day08-多线程 -> 正文阅读 |
|
[Java知识库]day08-多线程 |
1.创建线程首先讲一下Thread的构造器
?
Thread()
:
创建新的
Thread
对象? ?
new 自己创建得继承Thread得类
?
Thread(String threadname)
:
创建线程并指定线程实例名
?
Thread(Runnable target)
:
指定创建线程的目标对象,它实现了
Runnable
接
口中的
run
方法? ? ?
里面放的是实现Runnable接口的线程类
?
Thread(Runnable target, String name)
:
创建新的
Thread
对象
Thread的方法:
?
void start():
启动线程,并执行对象的
run()
方法
?
run():
线程在被调度时执行的操作
?
String getName():
返回线程的名称
?
void setName(String name)
:
设置该线程名称
?
static Thread currentThread():
返回当前线程。在
Thread
子类中就是this
,通常用于主线程和
Runnable
实现类
?
static void yield()
:
线程让步
?
暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
?
若队列中没有同优先级的线程,忽略此方法
?
join()
:
当某个程序执行流中调用其他线程的
join()
方法时,调用线程将被阻塞,直到 join()
方法加入的
join
线程执行完为止
?
低优先级的线程也可以获得执行
?
static void sleep(long millis)
:
(
指定时间
:
毫秒
)
?
令当前活动线程在指定时间段内放弃对
CPU
控制
,
使其他线程有机会被执行
,
时间到后重排队。
?
抛出
InterruptedException
异常
?
stop():
强制线程生命期结束,不推荐使用
?
boolean isAlive()
:
返回
boolean
,判断线程是否还活着
方式一:继承Thread类 1.继承Thread类 2.重写run方法? 3.创建对象? ?4.调用start方法
方式二:实现Runnable接口 1.实现Runnable接口? 2.重写run方法? 3.通过Thread类的构造器创建对象? 4.将含Runnable接口的对象作为参数传给Thread类构造器中? ?5.调用Thread类的start方法
Runnable和Thread实现多线程的区别:1.Runnable可以实现资源共享,创建一个Runnable接口的对象,这个对象作为一个参数传进Thread类里面两次,创建两个线程,但是两个线程执行的都是同一个任务,而Thread每创建一个类就是一个任务,不能实现资源共享 2.Thread是单继承,有局限性 方式三:实现callable接口 1.创建实现callable接口的实现类 2.重写call方法 3.创建接口实现类的对象 4.对象作为参数传给futuretask可以得到返回值, 5.futuretask作为参数传给线程类,完成线程的创建
?
与使用
Runnable
相比,
Callable
功能更强大些
????????
相比run()方法,可以有返回值
????????方法可以抛出异常
????????支持泛型的返回值
????????需要借助
FutureTask
类,比如获取返回结果
?
Future
接口
????????可以对具体
Runnable
、
Callable
任务的执行结果进行取消、查询是否完成、获取结果等。
????????FutrueTask
是
Futrue
接口的唯一的实现类
????????FutureTask
同时实现了
Runnable, Future
接口。它既可以作为Runnable被线程执行,又可以作为
Future
得到
Callable
的返回值
方式四:使用线程池、
1.首先创建线程池??
ExecutorService executorService = Executors.newFixedThreadPool(10); 2.执行线程 executorService.execute(number1);//execute适用于Runnable接口 executorService.submit();//submit适用于callable接口 3.关闭线程池 executorService.shutdown();
?
背景:
经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
?
思路:
提前
创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。
?
好处:
????????提高响应速度(减少了创建新线程的时间)
????????降低资源消耗(重复利用线程池中线程,不需要每次都创建)
????????便于线程管理
????????corePoolSize
:核心池的大小
????????maximumPoolSize
:最大线程数
????????keepAliveTime
:线程没有任务时最多保持多长时间后会终止
线程池相关API
?
JDK 5.0
起提供了线程池相关
API
:
ExecutorService
和
Executors
?
ExecutorService
:真正的线程池接口。常见子类
ThreadPoolExecutor
????????void execute(Runnable command)
:执行任务
/
命令,没有返回值,一般用来执行Runnable
????????<T> Future<T> submit(Callable<T> task)
:执行任务,有返回值,一般又来执行Callable
????????void shutdown()
:关闭连接池
?
Executors
:工具类、线程池的工厂类,用于创建并返回不同类型的线程池
???????? Executors.newCachedThreadPool()
:创建一个可根据需要创建新线程的线程池
????????Executors.newFixedThreadPool(n);
创建一个可重用固定线程数的线程池
???????? Executors.newSingleThreadExecutor()
:创建一个只有一个线程的线程池
???????? Executors.newScheduledThreadPool(n)
:创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行
2.同步问题解决同步的方法: 1.同步代码块 synchronized(同步监视器){ 需要被同步的代码 }
2.同步方法 public synchronized void 同步方法(){ 需要被同步的代码 }
3.lock锁 1.创建锁 ReentrantLock lock = new?ReentrantLock() try{ ????????2.使用锁 lock.lock() }finally{ ????????3.解锁? lock.unlock() }
3.线程通信wait()? 阻塞当前线程,并释放锁 notify()唤醒一个阻塞的线程 notifyall()唤醒所有阻塞的线程 以上三个方法的调用者必须是 同步监视器
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:13:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |