Java中Thread类的用法

目录

1. 线程创建

2. 线程中断

3. 线程等待

4. 线程休眠

5. 获取线程实例


1. 线程创建

创建线程的方法有很多种,常见的分为以下5个:

⽅法1 继承 Thread 类

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

⽅法2 实现 Runnable 接⼝

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

其他变形:

匿名内部类创建 Thread ⼦类对象

// 使⽤匿名类创建 Thread ⼦类对象
Thread t1 = new Thread() {
 @Override
 public void run() {
 System.out.println("使⽤匿名类创建 Thread ⼦类对象");
 }
};

匿名内部类创建 Runnable ⼦类对象

// 使⽤匿名类创建 Runnable ⼦类对象
Thread t2 = new Thread(new Runnable() {
 @Override
 public void run() {
 System.out.println("使⽤匿名类创建 Runnable ⼦类对象");
 }
});

lambda 表达式创建 Runnable ⼦类对象

// 使⽤ lambda 表达式创建 Runnable ⼦类对象
Thread t3 = new Thread(() -> System.out.println("使⽤匿名类创建 Thread ⼦类对象"));
Thread t4 = new Thread(() -> {
 System.out.println("使⽤匿名类创建 Thread ⼦类对象");
});

那么问题来了。我们创建了一个线程,那如何才能启动一个线程呢?

之前我们已经看到了如何通过覆写 run ⽅法创建⼀个线程对象,但线程对象被创建出来并不意味着线 程就开始运⾏了。

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

• 线程对象可以认为是把 李四、王五叫过来了

• ⽽调⽤ start() ⽅法,就是喊⼀声:”⾏动起来!“,线程才真正独⽴去执⾏了。

调⽤ start ⽅法, 才真的在操作系统的底层创建出⼀个线程

2. 线程中断

李四⼀旦进到⼯作状态,他就会按照⾏动指南上的步骤去进⾏⼯作,不完成是不会结束的。但有时我 们需要增加⼀些机制,例如⽼板突然来电话了,说转账的对⽅是个骗⼦,需要赶紧停⽌转账,那张三 该如何通知李四停⽌呢?这就涉及到我们的停⽌线程的⽅式了。

⽬前常⻅的有以下两种⽅式:

 1. 通过共享的标记来进⾏沟通

 2. 调⽤ interrupt() ⽅法来通知

: 使⽤ Thread.interrupted() 或者

Thread.currentThread().isInterrupted() 代替⾃定义标志位.

Thread 内部包含了⼀个 boolean 类型的变量作为线程是否被中断的标记.

方法说明
public void interrupt()中断对象关联的线程
public static boolean interrupted()判断当前线程的中断标志位是否设置
public boolean isinterrupted()判断对象关联的线程的中断标志位是否设置

使⽤ thread 对象的 interrupted() ⽅法通知线程结束

public class ThreadDemo {
 private static class MyRunnable implements Runnable {
 @Override
 public void run() {
 // 两种⽅法均可以
 while (!Thread.interrupted()) {
 //while (!Thread.currentThread().isInterrupted()) {
 System.out.println(Thread.currentThread().getName()
 + ": 别管我,我忙着转账呢!");
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 System.out.println(Thread.currentThread().getName()
 + ": 有内⻤,终⽌交易!");
 // 注意此处的 break
 break;
 }
 }
 System.out.println(Thread.currentThread().getName()
 + ": 啊!险些误了⼤事");
 }
 }
 public static void main(String[] args) throws InterruptedException {
 MyRunnable target = new MyRunnable();
 Thread thread = new Thread(target, "李四");
 System.out.println(Thread.currentThread().getName()
 + ": 让李四开始转账。");
 thread.start();
 Thread.sleep(10 * 1000);
 System.out.println(Thread.currentThread().getName()
 + ": ⽼板来电话了,得赶紧通知李四对⽅是个骗⼦!");
 thread.interrupt();
 }
}

3. 线程等待

    等待⼀个线程 - join()

有时,我们需要等待⼀个线程完成它的⼯作后,才能进⾏⾃⼰的下⼀步⼯作。例如,张三只有等李四 转账成功,才决定是否存钱,这时我们需要⼀个⽅法明确等待线程的结束。

public class ThreadDemo {
 public static void main(String[] args) throws InterruptedException {
 Runnable target = () -> {
 for (int i = 0; i < 10; i++) {
 try {
 System.out.println(Thread.currentThread().getName() 
 + ": 我还在⼯作!");
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 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)同理,但可以更高精度

4. 线程休眠

也是我们⽐较熟悉⼀组⽅法,有⼀点要记得,因为线程的调度是不可控的,所以,这个⽅法只能保证 实际休眠时间是⼤于等于参数设置的休眠时间的。

方法说明
public static void sleep(long millis) throws interrupedException休眠当前线程
public static void sleep(long millis,int nanos) throws interrupedException可以更高精度
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());
 }
}

5. 获取线程实例

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

以上便是线程的创建、启动、中断、等待、休眠、获取示例的相关知识。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值