存放日常开发所撰写的Markdown文件。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.9 KiB

3 years ago
# Java 线程
![截屏2022-09-02 下午9.11.50](/Users/adiao/Desktop/%E6%88%AA%E5%B1%8F2022-09-02%20%E4%B8%8B%E5%8D%889.11.50.png)
> 这是线程的结构,通过这个图中了解到,线程是由虚拟机栈、程序计数器组成。并共享方法区和堆,至于本地方法栈,则和虚拟栈差不多。都是等同的效果。
我们可以这么理解,线程比作一个合租公寓,厨房、厕所(方法区、堆);供每个人(线程)使用。至于何时何地用则是分配问题(线程同步)。我们可以通过时钟(CPU时间片轮)在程序计数器来对每个人的使用问题上进行分配。
## 如何使用和创建线程?
可采用如下代码:
```java
//创建一个继承Thread类的子类。
class MyThreadsTost extends Thread{
//重写线程的run方法。
@Override
public void run(){
System.out.println("这里是新的线程。")
}
}
public class ThreadsTast {
public static void main(String [] args){
//实例化子类。
MyThreadsTast threads1 = new MyThreadsTast();
threads1.start(); //这里只能调用start方法来创建新的线程。否则就会像调用类方法一样,会在main中执行子类的run方法内容。
System.out.println("这里是main的主线程。")
}
}
```
结果:
这里是main的主线程。
这里是新的线程。
证明已开线程:
在显示函数中,添加`Thread.currentThread().getName()`到print中。
就会显示如下结果:
Thread-0: 这里是新的线程。
Main: 这里是main的主线程。
---
Start 方法在线程中只能start一次。不能start两次不然会报异常。
可以通过将子类重新创建一个线程对象来在使用一次。
---
假设:当我们只使用一次线程来执行某个方法时,可以采用匿名子类来实现,这样当应用执行到这里时就可以执行这个子类。然后执行完后就会自动回收。其写法如下:
```java
new Thread(){
@Override
public void run(){
'''相关操作。'''
}
}.start();
```
---
## Thread 类的常用方法。
1. start方法,用作于执行创建新线程。
2. run方法,作用于线程干什么事。
3. currentThread方法,返回当前线程代码的线程
4. getName方法,获取当前线程名字。
5. setName方法,设置当前线程方法。
6. join方法,暂停当前线程的运行,调用分线程来运行,等分线程运行完后再次执行当前线程。
```java
h1.join(); //这是调用的方法,可以在主线程执行到要其他线程给结果才能运行时,可采用此方法。
```
7. sleep方法,控制当前线程堵塞时常。
8. isAlive方法,判断当前线程是否存活。
---
## 线程优先级
![截屏2022-09-02 下午11.23.15](../../Desktop/%E6%88%AA%E5%B1%8F2022-09-02%20%E4%B8%8B%E5%8D%8811.23.15.png)
这个优先级是个肋鸡功能。优先级高是表示高概率执行。并不意味着只有高优先级执行。