线程的基础操作

一,Thread 的常见构造方法

方法说明
Thread()创建线程对象
Thread(Runnable target)使用Runnable对象创建线程对象
Thread(String name)创建线程对象,并命名
Thread(Runnable target, String name)使用Runnable对象创建线程对象,并命名

//线程的介绍以及基础创建见上一博客

二,Thread 的几个常见属性

属性获取方法
IDgetld()
名称getName()
状态getState()
优先级getPriority()
是否后台线程isDaemon()
是否存活isAlive()
是否被中断islnterrupted()

关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。

是否存活,即简单的理解,为 run 方法是否运行结束了

三,启动一个线程-start()

这里可能会有一个问题:Thread类中run和start的区别?

我们可以从两方面来看:

作用功能不同:

  1. run方法的作用是描述线程具体要执行的任务;
  2. start方法的作用是真正的去申请系统线程

运行结果不同:

  1. run方法是一个类中的普通方法,主动调用和调用普通方法一样,会顺序执行一次;
  2. start调用方法后, start方法内部会调用Java 本地方法(封装了对系统底层的调用)真正的启动线程,并执行run方法中的代码,run 方法执行完成后线程进入销毁阶段。

* 调用 start 方法,才能真正的在操作系统底层创建出一个线程

四,中断一个线程

方法说明

public void interrupt()

中断对象关联的线程,如果线程正在阻塞,则以异常方式通知,否则设置标志位
public static booleaninterrupted()判断当前线程的中断标志位是否设置,调用后清除标志位
booleanisInterrupted()判断对象关联的线程的标志位是否设置,调用后不清除标志位

thread 收到通知的方式有两种:

      1. 如果线程因为调用 wait/join/sleep 等方法而阻塞挂起,则以 InterruptedException 异常的形式通知,清除中断标志

              * 当出现 InterruptedException 的时候, 要不要结束线程取决于 catch 中代码的写法. 可以选择忽略这个异常, 也可以跳出循环结束线程. 
      2. 若只是内部的一个中断标志被设置,thread 可以通过

                Thread.interrupted() 判断当前线程的中断标志被设置,清除中断标志                                              Thread.currentThread().isInterrupted() 判断指定线程的中断标志被设置,不清除中断标  志这种方式通知收到的更及时,即使线程正在 sleep 也可以马上收到

五,等待一个线程-join()

有时,我们需要等待一个线程完成它的工作后,才能进行自己的下一步工作。

用一个代码解释 join() 的作用

public class test1 {
    public static void main(String[] args) throws InterruptedException{
        Runnable target = () -> {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + ":我还在工作");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println(Thread.currentThread().getName() + ":我结束了!");
        };
        Thread thread1 = new Thread(target, "李四");
        Thread thread2 = new Thread(target, "王五");
        System.out.println("先让李四开始工作");
        thread1.start();
        thread1.join();
        System.out.println("李四工作结束了,让王五开始工作");
        thread2.start();
        thread2.join();
        System.out.println("王五工作结束了");

    }
}

运行结果:

 附录:

方法说明
public void join()等待线程结束
public void join(long millis)等待线程结束,最多等 millis 毫秒
public void join(long millis, int nanos)同上,但可以更高精度

六,获取当前线程引用

方法说明
public static Thread currentThread();返回当前线程对象的引用
public class test2 { 
    public static void main(String[] args) { 
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName()); 
    }
}

七,休眠当前线程

方法说明

public static void sleep(long millis) throws InterruptedException millis

休眠当前线程 (millis 毫秒)
public static void sleep(long millis, int nanos) throwsInterruptedException可以更高精度的休眠

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值