# 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) 这个优先级是个肋鸡功能。优先级高是表示高概率执行。并不意味着只有高优先级执行。