前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 多线程系列(2) —— 线程的常用方法

Java 多线程系列(2) —— 线程的常用方法

作者头像
求和小熊猫
发布2020-12-02 14:54:56
3800
发布2020-12-02 14:54:56
举报
文章被收录于专栏:∑小熊猫的博客

中断线程

Java 线程使用一种机制来表想要终止他。这个中断机制依靠线程对象来检查当前线程是否需要中断,同时对象也可以决定是否响应中断请求。

Java 中断线程的方法为 Thread.interrupt(),该方法会读取中断标志位并重置中断标志位。同时我们可以使用 Thread.isInterrupted() 方法来判断线程是否收到中断信号。

在调用 interrupt 方法时,如果线程处于 WAITING 状态或者 TIMED_WAITING 状态,则会抛出一个 InterruptedException 异常。 【示例】

待中断的线程

该线程主要负责不断答应质数

代码语言:javascript
复制
public class PrimeGenerator extends Thread {
	@Override
	public void run() {
		long number = 1L;
		while (true) {
			if(isPrime(number)) {
				System.out.printf("Number %d is Prime\n", number);
			}
			if(isInterrupted()) {
				System.out.println("The Prime Generator has been Interrupted\n");
				break;
			}
			number++;
		}
	}
	
	private boolean isPrime(long number) {
		if(number <=2) {
			return true;
		}
		for(long i=2; i<number; i++) {
			if((number %i)==0) {
				return false;
			}
		}
		return true;
	}
}

Main 方法

调用线程并中断线程

代码语言:javascript
复制
public class Main {

	public static void main(String[] args) {
		Thread task = new PrimeGenerator();
		task.start();
		try {
			Thread.sleep(5000);
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
		task.interrupt();
		System.out.printf("Main: Status of the Thread: %s\n", task.getState());
		System.out.printf("Main: IsInterrupted: %s\n", task.isInterrupted());
		System.out.printf("Main: Is Alive %s\n", task.isAlive());
	}

}

PS: 线程在调用 interrupt 方法时会强制唤醒线程

线程休眠

线程休眠有两种方式,一种是 Thread.sleep() 方法,另一种是使用 TimeUnit 枚举类的 sleep() 方法。

两种休眠方法的区别:

  • Thread.sleep() :接受一个long 类型的变量,时间单位为毫秒
  • TimeUnit : 可以自动设定时间单位。

【示例】

代码语言:javascript
复制
TimeUnit.SECONDS.sleeep(5);

线程等待与唤醒

线程的等待的常用函数为 Object.wait() 而线程唤醒的常用函数为 Object.notiyfy()Object.notifyall()

wait() 方法会释放当前所占有的锁,让线程进入到重新请求锁的状态来实现阻塞 notify()notifyAll() 会通知相应的线程去重新获得锁。

为什么线程的等待与唤醒会放在 Object 类中?

要想更好的理解这个问题可以看以下代码

代码语言:javascript
复制
synchronized(obj){
    ...
    obj.wait();
    ...
}



synchronized(obj){
    ...
    obj.notify();
    ...
}

当我们在执行过程中,线程已经不满足继续执行的条件导致阻塞,那么我么需要释放相应的资源,但同时我们又不能破坏线程操作的原子性,那么这个时候我们只需要释放对象所持有的锁即可。由于 synchronized 能够锁住任何的对象,因此为了能够保证顺利释放对象,因此 notify 和 wait 便放在了 Object 对象中。

PS: wait 和 notify 必须和 synchronized 关键字一起使用,因为 wait 释放锁的前提是加锁,而 notify 的重新竞争也是在加锁的基础进行的。

线程礼让

线程礼让的方法为 Thread.yield() 方法时暂停当前正在执行的线程,也可理解为线程让出当前的执行时间片给其他线程。在礼让过程中不会释放锁。

等待线程结束

在某些情况下,我们需要某个线程等待其他线程执行结束后再继续执行时,我们可以使用 Thread.join() 方法。

join 方法类似于 wait 方法,会释放锁,只不过 join 方法释放的是正在执行的 thread 对象的锁。

方法掉用时线程状态转换图

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 中断线程
  • 线程休眠
  • 线程等待与唤醒
  • 线程礼让
  • 等待线程结束
  • 方法掉用时线程状态转换图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档