线程

六种状态

状态名称说明
NEW初始状态,被创建,但未调用start
RUNABLE就绪状态
RUNING运行状态
BLOCKED阻塞状态,表示线程阻塞于锁
WAITING等待状态,需要等待其他线程做出特定的动作(通知或中断)
TIME_WAITING超时等待状态,可以在指定时间内自动返回
TERMINATED终止状态

在这里插入图片描述

阻塞与等待的区别

  • 阻塞:当一个线程试图获取对象锁(非java.util.concurrent库中的锁,即synchronized),而该锁被其他线程持有,则该线程进入阻塞状态。它的特点是使用简单,由JVM调度器来决定唤醒自己,而不需要由另一个线程来显式唤醒自己,不响应中断
  • 等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。它的特点是需要等待另一个线程显式地唤醒自己,实现灵活,语义更丰富,可响应中断。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。

需要强调的是虽然synchronized和JUC里的Lock都实现锁的功能,但线程进入的状态是不一样的。synchronized会让线程进入阻塞态,而JUC里的Lock是用LockSupport.park()/unpark()来实现阻塞/唤醒的,会让线程进入等待态。但话又说回来,虽然等锁时进入的状态不一样,但被唤醒后又都进入runnable态,从行为效果来看又是一样的

线程创建

无返回值

  • 实现Runnable接口
    Thread thread = new Thread(new Runnable(){
        public void run(){
            
        }
    });
    
  • 继承Thread类
    Thread thread = new Thread(){
        public void run(){
            
        }
    };
    

有返回值

  • 实现Callable 接口,只有一个call方法
public class MyCallable implements Callable<Integer> {
	@Override
	public Integer call() {
	    System.out.println(Thread.currentThread().getName() + " call()方法执行中...");
	    return 1;
	}
}

Future

  • Callable用于产生结果,Future 用于获取结果

Callable+Future获取多线程的执行结果。

  • 利用线程池

使用Callable+FutureTask获取多线程的执行结果

sleep和wait

  • Thread静态方法、
  • 不释放锁、释放锁
  • wait只能在同步方法或同步块中使用

线程中断机制

  • 线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。
    1、java.lang.Thread#interrupt
    中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。
    2、java.lang.Thread#isInterrupted()
    判断目标线程是否被中断,不会清除中断标记。
    3、java.lang.Thread#interrupted
    判断目标线程是否被中断,会清除中断标记。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值