初识多线程(1.0)
目录
多线程
在大致了解多线程后(见上一篇)
那如何编写一个简单的多线程的代码呢?
以idea 为例

以上是一个简单的多线程并发执行
t.start() (这里主要完成建立一个新的线程)
多线程执行时 可称为 ‘抢占式执行’
所以说 多进程调度是随机的

t.run() 就无法完成这样的效果(主要的区别就是 run 内没有创建一个新的线程)
只在main单线程中 所以要调用先前的重写的 run 方法 再打印 main 中的方法

JDK中提供了有关线程的查看方式
这里都是进程中的自带的线程
JVM 中内置的线程

当线程未名时 JDK会自动提供

也会提供线程的调度状态 和 代码的位置
多线程 の 创建
1.继承thread 重写run
如上图
2.实现Runnable 重写run
本质作为接口 然后将runnable的实例传递给 thread

3.使用匿名内部类的方法
其实就上方法1中的稍作调整
public void run() {
while (true){
System.out.println("hello thread");
try {
sleep(1000);
}catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
放入
Thread t = new mythread();

4.RUNNBALE的内部类方法

5.基于3与4的ambda表达式方法
(最常用的)
本质上是一个‘匿名函数’ 回调函数
()-> {}

Thread
基本的构造方法
| 构造方法 | 作用 |
|---|---|
Thread() | 创建线程对象 |
Thread(Runnable target) | 使用 Runnable对象 创建对象 |
Thread(String name) | 创建线程对象并命名 |
Thread(Runnable target, String name) | 使用 Runnable对象 创建对象 + 命名 |
Thread(ThreadGroup group, Runnable target) | 线程可以被用来分组管理,分号的组被称作线程组(了解即可) |
属性
| 属性 | 方法 / 字段 | 作用说明 | 备注 |
|---|---|---|---|
| 线程名称 | getName() / setName() | 获取 / 设置线程名 | 默认 Thread-0、Thread-1... |
| 线程 ID | getId() | 获取线程唯一标识 | 只读,JVM 自动分配 |
| 优先级 | getPriority() / setPriority() | 线程调度优先级 | 范围 1~10,默认 5 |
| 守护线程 | isDaemon() / setDaemon() | 是否为守护线程 | 需在 start () 之前设置 |
| 线程状态 | getState() | 获取当前线程生命周期状态 | 共 6 种枚举状态 |
| 是否存活 | isAlive() | 判断线程是否已启动且未结束 | 新建 / 终止都返回 false |
| 是否中断 | isInterrupted() | 判断线程是否被标记中断 | 不清除中断标记 |
| 上下文类加载器 | getContextClassLoader() | 获取线程上下文类加载器 | 框架底层常用 |
前台线程:当主线程结束时,还会有继续执行的进程,这些 线程 的结束 会影响 进程 的存在,这样的线程叫做 前台线程
后台线程: 与之相反的,如果线程的结束不会影响 进程 的存在 这样称作 后台线程
当线程中有多个前台线程时,要将所有的前台线程结束才能结束进程
进程之间存在父子关系
而线程中并没有这样的关系
isAlive()
创建thread对象 原本是一一对应的
但是thread的生命周期 和 系统中创建的线程生命周期是不同的

随机调度的缘由 在最后一次打印true 的时位置 也可能在hello thread的前面
中断一个线程
在先前了解 start 创建一个线程
每一个thread 都是只有一个对应的 start
每创建一个新线程 都要有一个新的thread对象
⽬前常⻅的有以下两种⽅式:
1.通过共享的标记来进⾏沟通

此代码主要实现3秒后结束线程
private static boolean isFinished = false;
是否可以创建在main中呢?

答案是显然不的
所以这里采用了 变量捕获
lamda 是 回调函数
表明 在执行时间在很久以后(在操作系统中的线程创立之后)
可能在后续线程创建后,main线程已经执行完成 isFinished 已经被销毁了

GC(垃圾回收)
所以定义在main 函数之外
2.调⽤ interrupt() ⽅法来通
Thread 内部包含了⼀个boolean类型的变量作为线程是否被中断的标记.
Thread.currentThread().isInterrupted()
判断线程是否被终止
currentThread() 这里有点类似与 this 的作用 谁调用谁使用
静态方法


t.interrupt();
检测到主动终止 修改Boolean 中的变量
此外 interrupt 不仅可以修改 BOOlean 还可以 修改 sleep
未完。。。。
低效产出中。。。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)