sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就绪状态,等待CPU的再次调度,注意是就绪状态,而不是重新拿回CPU的执行权。并且,在休眠期间,只是会让出CPU的执行权,但是之前获得的锁资源,还是继续持有,等CPU调度到该线程重新获取到执行权的时候,就会继续运行sleep之后的代码。接下来用一个例子来说明Sleep期间不会放弃锁资源

public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
Lock lock = new ReentrantLock();
Thread one = new Thread(() -> {
lock.lock();
System.out.println("线程A准备被Sleep"); //1
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程A被唤醒"); //2
lock.unlock();
});
Thread two = new Thread(() -> {
lock.lock();
System.out.println("线程B准备被Sleep"); //3
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程B被唤醒"); //4
lock.unlock();
});
one.start();
two.start();
}
}

在上面的代码中,new了两个线程,但是只有一个锁资源lock,如果sleep期间会释放锁资源的话,那么输出结果应当是交替输出的,因为在执行代码1的时候,会被剥夺执行权,那么线程2将会拿到锁,但是事实真的是这样吗,看输出结果

线程A准备被Sleep

线程A被唤醒

线程B准备被Sleep

线程B被唤醒

可以看到,线程A被sleep的时候,线程2执行,想要获取锁I资源lock,但是发现lock被占有了,只好阻塞,然后线程1的休眠时间到了,重新获取执行权,继续执行sleep之后的代码,然后释放锁,然后线程2拿到锁,执行后续代码。通过上面的代码就可以看出,sleep期间是不会释放锁资源的,只是暂时的让出了cpu的执行权

创建多线程程序的第二种方式-实现Runnable接口

java.lang. Runnable也是非吊军儿的一种,我们只需要重与run万法即可。

步骤如下∶

  1.定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

  ⒉创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

  3.调用线程对象的start()方法来启动线程

public class Demo_Runnable implements Runnable{
@Override
public void run() {
for(int i = 0; i < 20; i++){
System.out.println(Thread.currentThread().getName()+"--》"+i);
}
}
public static void main(String[] args) {
Demo_Runnable demo_runnable = new Demo_Runnable();
Thread thread = new Thread(demo_runnable); thread.start(); for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->"+i); } }
}
// 创建线程2: 实现Runnable接口,重写run()方法,执行线程需要丢入的runnable接口实现类,调用start()方法。
public class TestThread3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
// run方法线程体
System.out.println("我在看代码-----" + i);
}
} public static void main(String[] args) {
// 创建Runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();
// 创建线程,对象通过线程对象开启线程
// Thread thread = new Thread(testThread3);
// thread.start(); new Thread(testThread3).start(); for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程-----" + i);
}
}
}

Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口的更多相关文章

  1. Thread类的常用方法_sleep和创建多线程程序的第二种方式实现Runnable接口

    public static void sleep(long millis);//使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行). 毫秒数结束后线程继续执行 package com.yang.T ...

  2. 创建多线程程序的第一种方式_创建Thread类的子类

    创建多线程程序的第一种方式:创建Thread类的子类java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 ...

  3. 主线程和创建多线程程序的第一种方式_创建Thread类的子类

    /** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...

  4. Java创建线程的第二种方式:实现runable接口

    /*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在 ...

  5. 50、多线程创建的三种方式之实现Runnable接口

    实现Runnable接口创建线程 使用Runnable创建线程步骤: package com.sutaoyu.Thread; //1.自定义一个类实现java.lang包下的Runnable接口 cl ...

  6. Thread类的常用方法----多线程基础练习

    创建多线程程序的第一种方式----继承Thread类 常用API 构造方法 public Thread() :分配一个新的线程对象. public Thread(String name) :分配一个指 ...

  7. 多线程-创建线程第二种方式-实现Runnable接口-细节和好处

    1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...

  8. 创建线程的第二种方式------实现Runnable接口的方式

    package cn.itcast.demo16.Demo07.Runnable;/** * @author newcityman * @date 2019/7/22 - 23:17 */public ...

  9. 创建多线程的方式&Thread类的常用方法

    创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ...

随机推荐

  1. MySQL进阶之常用函数

    我的小站 有时候,除了简单的数据查询,我们还有一些高级的函数. MySQL 包含了大量并且丰富的函数,这套 MySQL 函数大全只收集了几十个常用的,剩下的比较罕见的函数我们就不再整理了,读者可以到M ...

  2. CUDA02 - 访存优化和Unified Memory

    CUDA02 - 的内存调度与优化 前面一篇(传送门)简单介绍了CUDA的底层架构和一些线程调度方面的问题,但这只是整个CUDA的第一步,下一个问题在于数据的访存:包括数据以何种形式在CPU/GPU之 ...

  3. Elemnt ui 组件封装(form)

    <template> <el-form class="form" :inline="formConfig.inline" :model=&qu ...

  4. 斯坦福NLP课程 | 第2讲 - 词向量进阶

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  5. Hadoop(四)C#连接Hive

    Hive Hive将HiveQL(类sql语言)转为MapReduce,完成数据的查询与分析,减少了编写MapReduce的复杂度.它有以下优点: 学习成本低:熟悉sql就能使用 良好的数据分析:底层 ...

  6. python数据类型、用户交互和运算符

    基本数据类型 1.字典dict(dictionary) 能够准确的记录储存的信息 """ 大括号里面 放多个元素 之间用逗号隔开 元素为K:V键表示储存 K相对于V一般表 ...

  7. 多线程05:unique_lock详解

    unique_lock详解 一.unique_lock取代lock_guard unique_lock是个类模板,实际应用中,一般lock_guard(推荐使用):lock_guard取代了mutex ...

  8. Centos7最小化安装报错There are no enabled repos. Run "yum repolist all" to see the repos you have.解决办法

    原因是缺少CentOS-Base.repo文件,因为我这台机器wget也不能用,所以我是下载到本地sftp上去的,传输的时候一定要在root用户下,否则会无法启动传输 这是报错的完整信息:Loadin ...

  9. KeyDB重量发布6.3.0开源版

    摘要:5月12日 KeyDB 社区隆重发布了 6.3.0开源版本,将与华为加拿大研究院DCS团队2021-2022年合作的成果,深度优化的企业版的能力贡献给了开源社区. KeyDB是目前Redis 分 ...

  10. 实践torch.fx第一篇——基于Pytorch的模型优化量化神器

    第一篇--什么是torch.fx 今天聊一下比较重要的torch.fx,也趁着这次机会把之前的torch.fx笔记整理下,笔记大概拆成三份,分别对应三篇: 什么是torch.fx 基于torch.fx ...