存放日常开发所撰写的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.

2.9 KiB

Java 线程

截屏2022-09-02 下午9.11.50

这是线程的结构,通过这个图中了解到,线程是由虚拟机栈、程序计数器组成。并共享方法区和堆,至于本地方法栈,则和虚拟栈差不多。都是等同的效果。

我们可以这么理解,线程比作一个合租公寓,厨房、厕所(方法区、堆);供每个人(线程)使用。至于何时何地用则是分配问题(线程同步)。我们可以通过时钟(CPU时间片轮)在程序计数器来对每个人的使用问题上进行分配。

如何使用和创建线程?

可采用如下代码:

//创建一个继承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两次不然会报异常。

可以通过将子类重新创建一个线程对象来在使用一次。


假设:当我们只使用一次线程来执行某个方法时,可以采用匿名子类来实现,这样当应用执行到这里时就可以执行这个子类。然后执行完后就会自动回收。其写法如下:

new Thread(){
  @Override
  public void run(){
    '''相关操作'''
  }
}.start();

Thread 类的常用方法。

  1. start方法,用作于执行创建新线程。

  2. run方法,作用于线程干什么事。

  3. currentThread方法,返回当前线程代码的线程

  4. getName方法,获取当前线程名字。

  5. setName方法,设置当前线程方法。

  6. join方法,暂停当前线程的运行,调用分线程来运行,等分线程运行完后再次执行当前线程。

    h1.join(); //这是调用的方法,可以在主线程执行到要其他线程给结果才能运行时,可采用此方法。
    
  7. sleep方法,控制当前线程堵塞时常。

  8. isAlive方法,判断当前线程是否存活。


线程优先级

截屏2022-09-02 下午11.23.15

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