java多线程(二)线程状态与操作线程的常用方法

一 . 线程的基本状态

  • 新生状态:线程开启
  • 就绪状态:具有了除CPU以外的所有资源
  • 运行状态:CPU调度,开始真正执行
  • 阻塞状态:因为某些原因放弃CPU,等待再次调度
  • 死亡状态:正常结束或者被强制结束

二 . 线程状态图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ba7hBo7d-1586010838194)(线程状态图.png)]

  • 死亡的线程不会回到就绪状态,而是从新生状态开始
  • 阻塞状态的进程回到就绪状态后,进入就绪队列,与其他在就绪队列中的线程共同等待CPU调度

三 . 在Java代码中的线程状态

  • 新生:线程对象一旦创建就进入了新生状态
  • 就绪:当调用start()方法时线程立刻进入就绪状态(并不意味着立即执行)
  • 运行:当CPU调度时代码真正运行才进入运行状态
  • 阻塞:当调用sleep(),wait()等方法或同步锁固定式,线程进入阻塞状态,就是代码不再往下执行
  • 死亡:代码执行完毕或者中断执行

四 . 操作线程的常用方法

  • sleep()
    • 使线程停止一段时间,将线程处于阻塞状态(如果只有一个线程,那么调用sleep()方法之后,需要等待sleep(time)中的time时间结束后才能进入就绪队列)
  • join()
    • 阻塞指定线程等到另一个线程完成以后再继续执行
  • yield()
    • 暂停当前正在执行的线程
    • 注意:不是阻塞进程,而是直接将进程变为就绪状态
  • setDaemon()
    • 将指定的线程设置成后台线程(即守护者线程)
    • 创建用户线程结束时,后台线程也会随之结束
    • 只能在线程启动之前把他设为后台线程
  • setPriority(int newPriority);getPriority()
    • 设置线程的优先级(这里的优先级代表概率,并不是优先级高的线程先执行,而是优先级越高,线程执行可能性越大)
    • 范围从0到10,默认为5
  • stop()和distory()(已经不推荐使用)
    • 停止线程

五 . 常用方法的使用

返回值类型方法和描述
static voidsleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。
static voidsleep(long millis, int nanos) 导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。
static voidyield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。
voidsetPriority(int newPriority) 更改此线程的优先级。
voidsetDaemon(boolean on) 将此线程标记为 daemon线程或用户线程。
voidjoin() 等待这个线程死亡。
voidstop() 已弃用 这种方法本质上是不安全的。 使用Thread.stop停止线程可以解锁所有已锁定的监视器(由于未ThreadDeath ThreadDeath异常在堆栈中ThreadDeath的自然结果)。
voiddestroy() 已弃用 这种方法最初是为了销毁这个线程而没有任何清理。 它所持有的任何监视器都将保持锁定。
public class test {
    public static void main(String[] args) throws InterruptedException {
        //sleep()方法是使当前线程阻塞的时间
        Thread.sleep(6*1000);
        //等待6秒后才会继续执行下面的代码
        //暂停当前的主进程,由于当前只有一个进程,因此暂停完毕后会继续往下执行
        Thread.yield();
        Thread you = new Thread(new You());
        Thread God = new Thread(new God());
        //设置you这个线程的优先级,优先级越高被调用的可能性越大,优先级只能在[1-10]之间,默认的优先级是5
        you.setPriority(10);
        you.start();
        //调用jion()方法.表示必须等待you这个线程执行完毕才能继续执行
        you.join();
        //设置God为守护进程,JVM不会等待守护进程结束,JVM等待所有用户进程结束后就会停止
        //因此这里God线程内部虽然是个while(true)循环,但因为它是个守护进程,因此等到主线程和you这个线程结束后,JVM就会停止运行
        God.setDaemon(true);
        God.start();
    }
}
class God extends Thread{
    public void run(){
        while(true) {
            System.out.println("上帝守护你");
        }
    }
}
class You extends Thread{
    public void run (){
        System.out.println("吃喝玩乐");
    }
}
吃喝玩乐
上帝守护你
上帝守护你
上帝守护你
上帝守护你
上帝守护你
上帝守护你
Process finished with exit code 0
  • 这里再说明一下守护线程,进程分为用户进程和守护线程,JVM运行时会等待所有用户线程运行完成才会结束终止。而不会管守护线程有没有运行完成。
  • 因此虽然God这个线程内部执行的部分是个死循环,但等到用户线程运行完毕后,JVM会停止,所以有那样的运行结果。
  • 还有一点我们现在已经抛弃stop()和distroy()方法,那么怎么去人为操作使得线程停止,这里API给的意见是加一个变量去控制,比如上边的God线程中while循环的参数换成一个变量,在我们想要停时只需要把变量置为false。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值