【Java】学习路径44-多线程入门篇

Posted on 2022-05-09 12:47  罗芭Remoo  阅读(51)  评论(0编辑  收藏  举报

这一章,我们学习线程的创建、线程的启动、线程的名字设置、线程的休眠、线程的加入、守护线程、


一个线程是一个单独的类的对象。

想让一个普通的类变成多线程,那么这个类需要继承Thread。


创建多线程的步骤:

1、创建一个

2、使这个继承自Thread

3、在中重写run方法

4、在主线程main中调用这个start()方法

注意:我们调用这个多线程的类是使用start()方法,而不是run()方法

这个是我们多线程类:

public class MyThread extends Thread{
    @Override
    public void run(){
        //--------------------
        //这个是新的线程
        //在这里输入线程安全的代码
        //--------------------
    }
}

这个是我们的main方法,我们在这里调用多线程:

public class test01_CreateThread {
    public static void main(String[] args) {
        MyThread MyThread_test01 = new MyThread();
        //MyThread_test01.run();//错误调用方法!
        MyThread_test01.start();
        
        }
    }
}

取得当前所在线程currentThread():

创建一个Thread对象,然后使用currentThread()

Thread mainThread = Thread.currentThread();

在哪个线程调用就返回哪个线程的对象。

有点类似于this.关键字的作用。


查看优先级方法getPriority():

使用Thread对象中的getPriority()方法。

getPriority()

优先级常量:

线程优先级的三个数量,默认优先级是5,最高优先级是10,最低优先值是1。

/**
 * The minimum priority that a thread can have.
 */
public static final int MIN_PRIORITY = 1;

/**
 * The default priority that is assigned to a thread.
 */
public static final int NORM_PRIORITY = 5;

/**
 * The maximum priority that a thread can have.
 */
public static final int MAX_PRIORITY = 10;

 设置优先级setPriority():

我们对线程对象使用setPriority()方法设置线程的优先度。

mainThread.setPriority(10);

 参数必须确保在MIN_PRIORITYMAX_PRIORITY之间,否则可能会抛出如下错误:

1、IllegalArgumentException – If the priority is not in the range MIN_PRIORITY to MAX_PRIORITY.
2、SecurityException – if the current thread cannot modify this thread.


创建多个多线程:

我们不可以重复调用同一个Thread对象的start()方法,否则会报错:

Exception in thread "main" java.lang.IllegalThreadStateException

我们需要重新初始化构造一个新的Thread对象


线程名字设置:

系统会默认分配线程的名称:Thread-0、Thread-1......从0开始

我们也可以改变线程的名字,

方法一:setName()方法

thread_test01.setName("我是线程A");

方法二:为线程类添加构造方法,再使用父类的构造方法传入名字

这个是Thread类(父类)的构造方法。

我们只需要在我们的线程类中调用super()就可以将线程名字传入到Thread父类的构造方法中了。

public class Thread_Test01 extends Thread{
    public Thread_Test01(){}//无参构造方法,名字由系统默认分配
    public Thread_Test01(String name){//传入名字的构造方法
        super(name);
    }
    @Override
    public void run(){

    }
}

线程名字的获取getName():

getName()返回String

thread_test01.setName("我是线程A");
thread_test01.getName();

 


线程休眠Thread.sleep():

单位是毫秒ms。作用是让线程休眠一段时间后再执行。

注意:需要添加try catch.

try {
    Thread.sleep(4000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

线程加入join()

例子:在main中调用t1.join();

作用:让t1线程加入到main中,合二为一,调用join之前main和t1同步执行,现在是等待t1执行完再继续执行。

注意:也需要加try catch.


 概念:守护线程(Daemon Thread)

我们把一个线程设置为“守护线程”,此时这个线程就会被系统标记为“内部线程”,其生命周期就会交给JVM虚拟机系统来管理。

当其他的“非守护线程”都结束运行时,“守护线程”就会被系统自动关闭。(关闭也许需要一点点的时间)

Thread_Test01 t1 = new Thread_Test01();
t1.setDaemon(true);

中断线程:

方法一:stop(),但已被弃用。

这个方法十分暴力,只要调用了stop()方法,这个线程就会被立马销毁。

方法二:interrupt()

这个方法是官方推荐的关闭线程的方法。

但是这个方法不会真正的关闭线程

实际上,这个方法只会修改一个内部变量---isInterrupted()

t1.isInterrupted();

当调用了interrupt()方法之后,isInterrupted()就会返回true。

我们只需要在多线程的代码中加入一个if判断,判断一下就好,如果为true,则break即可。