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
99 lines
2.9 KiB
|
3 years ago
|
# Java 线程
|
||
|
|
|
||
|
|

|
||
|
|
|
||
|
|
> 这是线程的结构,通过这个图中了解到,线程是由虚拟机栈、程序计数器组成。并共享方法区和堆,至于本地方法栈,则和虚拟栈差不多。都是等同的效果。
|
||
|
|
|
||
|
|
我们可以这么理解,线程比作一个合租公寓,厨房、厕所(方法区、堆);供每个人(线程)使用。至于何时何地用则是分配问题(线程同步)。我们可以通过时钟(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方法,判断当前线程是否存活。
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 线程优先级
|
||
|
|
|
||
|
|

|
||
|
|
|
||
|
|
这个优先级是个肋鸡功能。优先级高是表示高概率执行。并不意味着只有高优先级执行。
|
||
|
|
|