线程的基本用法

1. 创建线程

目录

1. 创建线程

其他变形

2. Thread的常见的构造方法

3.启动一个线程-start()

4 .中断一个线程

5.等待一个线程-join()

7.休眠当前线程

线程的状态

1. 观察线程的所有状态


1.1继承Thread类

1)继承Thread来创建线程类

class MyThread extend Thread {
   @Override
    public void run () {
        System.out.println("这里是线程运行的代码");
    }
}

2)创建myThread类的实例

MyThread t = new MyThread();

3)调用start方法启动线程

t.start();//线程开始运行

1.2实现Runable接口

1)实现Runable接口

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("这里是线程运行的代码");
    }
}

2)创建Thread 类实例,调用Thread的构造方法时将Run able对象作为target参数

Thread t = new Thread(new MyRunable);

3)调用start方法

t.start();//线程开始运行

对比上面两种方法:

  • 继承Thread类,直接使用this就表示当前线程的引用

  • 实现Run able接口,this表示的是MyRunable 的引用,需要使用Thread.currentThread()

其他变形

  • 匿名内部类创建Thread子类对象

//使用匿名内部类创建Thread子类对象
Thread t1 = new Thread() {
    @Override
    public void run() {
        System.out.println("使用匿名类创建Thread 子类对象")
    }
}

  • 匿名内部类创建Runnable子类对象

Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("使用匿名内部类创建Runnable子类对象")
    }
})
  • lambda表达式创建Runnable子类对象

Thread t3 = new Thread(() -> System.out.println("使用匿名内部类创建Thread 子类对象"));
Thread t3 = new Thread(() -{
    System.out.println("使用匿名内部类创建Thread 子类对象");
                             });
​
​
​

2. Thread的常见的构造方法

//方法                    说明
Thread()                 创建线程对象
Thread(Runnable targer)  使用Runnable对象来创建线程对象
Thread(String name)      创建线程对象,并命名
Thread(Runnable target,String name)   使用Runnable对象来创建线程对象,并命名
Thread(ThreadGroup group,Runnable target) 线程可以被用来分组管理,分好的即为线程组
Thread t1 = new Thread();
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread("这是我的名字");
Thread t4 = new Thread(new MyRunnable(), "这是我的名字");
    

3.启动一个线程-start()

上文中写了 如何通过覆写run方法来创建一个线程对象,但是线程对象创建出来不一定这个线程就运行了

  • 覆写run方法是提供给线程要做的事情的指令清单

  • 只是准备好了

  • 调用start方法就会让他呢直接运行起来

4 .中断一个线程

一旦开始就会等到所有线程都运行完才会结束,如果想要结束的话就得使用以下方法

两种常用的有以下两种方法:

  1. 通过分享的标记来进行沟通

  2. 调用interrupt()方法来通知

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

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

  • 当出现 InterruptedException 的时候, 要不要结束线程取决于 catch 中代码的写法. 可以选择 忽略这个异常, 也可以跳出循环结束线程.

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

观察标志位是否被清楚

标志位是否清除, 就类似于一个开关.
Thread.isInterrupted() 相当于按下开关, 开关自动弹起来了. 这个称为 "清除标志位"
Thread.currentThread().isInterrupted() 相当于按下开关之后, 开关弹不起来, 这个称为
"不清除标志位"

5.等待一个线程-join()

需要一个方法明确等待线程的结束,谁先用join谁先往完了干

6.获取当前线程引用

public static Thread currentThread(); //返回当前线程对象的引用

public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName());
    }
}

7.休眠当前线程

因为线程的调度是不可控的,所以,这个方法只能保证实 际休眠时间是大于等于参数设置的休眠时间的。

public class ThreadDemo {
    public static void main(String[] args) throws           InterruptedException {                          System.out.println(System.currentTimeMillis());
        Thread.sleep(3 * 1000);     System.out.println(System.currentTimeMillis());
    }
}

线程的状态

1. 线程的所有状态

线程状态是一个枚举类型Thread.State

public class ThreadState {
    public static void main(String[] args) {
    for (Thread.State state : Thread.State.values()) {
        System.out.println(state);
        }
    }
}
  • NEW 安排了工作还未开始

  • RUNNABLE: 可工作的,又可分成正在工作中和即将开始工作

  • BLOCKED:排队等待其他事情

  • WAITING:同上

  • TIMED_WAITING: 同上

  • TERMINATED:工作完成了

  • Thread.yield(),让出CUP

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值