java并发:初探sleep方法
sleep与wait
sleep是Thread方法,使得当前线程从运行态变为阻塞态。但它不会释放对象的锁。
wait方法是Object方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态,
它会释放对象的锁
sleep测试
package com.java.javabase.thread.sleep;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SleepTest {
private static int coutsize = 10;
private static Object obj = new Object();
public static void main(String[] args) {
Thread t1 =new ThreadOne("t1");
Thread t2 =new ThreadOne("t2");
t1.start();
t2.start();
}
static class ThreadOne extends Thread {
public ThreadOne(String name){
super(name);
}
@Override
public void run() {
synchronized (obj){
int i = 0;
try {
while (i < coutsize) {
log.info("current thread is : {} sleep {} times ",Thread.currentThread().getName(),i++);
Thread.sleep(300);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
说明
对于拥有同一个Object对象的两个线程,当一个线程持有对象的锁,虽然多次执行Thread,线程从运行态变为阻塞态,但也不会释放对象的锁,
其他的线程只能等待。
测试结果
2019-07-29 16:49:22,156 [t1] INFO SleepTest - current thread is : t1 sleep 0 times
2019-07-29 16:49:22,469 [t1] INFO SleepTest - current thread is : t1 sleep 1 times
2019-07-29 16:49:22,782 [t1] INFO SleepTest - current thread is : t1 sleep 2 times
2019-07-29 16:49:23,094 [t1] INFO SleepTest - current thread is : t1 sleep 3 times
2019-07-29 16:49:23,407 [t1] INFO SleepTest - current thread is : t1 sleep 4 times
2019-07-29 16:49:23,720 [t1] INFO SleepTest - current thread is : t1 sleep 5 times
2019-07-29 16:49:24,032 [t1] INFO SleepTest - current thread is : t1 sleep 6 times
2019-07-29 16:49:24,345 [t1] INFO SleepTest - current thread is : t1 sleep 7 times
2019-07-29 16:49:24,658 [t1] INFO SleepTest - current thread is : t1 sleep 8 times
2019-07-29 16:49:24,970 [t1] INFO SleepTest - current thread is : t1 sleep 9 times
2019-07-29 16:49:25,283 [t2] INFO SleepTest - current thread is : t2 sleep 0 times
2019-07-29 16:49:25,596 [t2] INFO SleepTest - current thread is : t2 sleep 1 times
2019-07-29 16:49:25,909 [t2] INFO SleepTest - current thread is : t2 sleep 2 times
2019-07-29 16:49:26,221 [t2] INFO SleepTest - current thread is : t2 sleep 3 times
2019-07-29 16:49:26,534 [t2] INFO SleepTest - current thread is : t2 sleep 4 times
2019-07-29 16:49:26,847 [t2] INFO SleepTest - current thread is : t2 sleep 5 times
2019-07-29 16:49:27,159 [t2] INFO SleepTest - current thread is : t2 sleep 6 times
2019-07-29 16:49:27,472 [t2] INFO SleepTest - current thread is : t2 sleep 7 times
2019-07-29 16:49:27,785 [t2] INFO SleepTest - current thread is : t2 sleep 8 times
2019-07-29 16:49:28,098 [t2] INFO SleepTest - current thread is : t2 sleep 9 times
java并发:初探sleep方法的更多相关文章
- java并发初探ConcurrentHashMap
java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...
- java并发初探CyclicBarrier
java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...
- java并发初探CountDownLatch
java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...
- java并发初探ConcurrentSkipListMap
java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...
- java并发初探ThreadPoolExecutor拒绝策略
java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...
- java并发初探ReentrantWriteReadLock
java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...
- Java并发编程核心方法与框架-Semaphore的使用
Semaphore中文含义是信号.信号系统,这个类的主要作用就是限制线程并发数量.如果不限制线程并发数量,CPU资源很快就会被耗尽,每个线程执行的任务会相当缓慢,因为CPU要把时间片分配给不同的线程对 ...
- Java并发编程核心方法与框架-CompletionService的使用
接口CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离.使用submit()执行任务,使用take取得已完成的任务,并按 ...
- Java并发编程核心方法与框架-TheadPoolExecutor的使用
类ThreadPoolExecutor最常使用的构造方法是 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAli ...
随机推荐
- About Computer Graphics 2.0
Notes of Computer Graphics 2.0: towards end-user-generated contents CG 1.0 Modeling: construct 3D mo ...
- Spring boot+Thymeleaf传参跳转
$.ajax(): $.ajax({ type: "get", url:"/public/inform", async: true, data: detailJ ...
- Node.js 服务端处理图片
Node 服务端处理图片 服务端进行图片处理是很常见的需求,但是Node在这一块相对来说比较薄弱.找了几个比较常见的模块来解决问题. gm GraphicsMagick for node 使用Open ...
- C:变量的声明与定义
声明变量不需要建立存储空间,如:extern int a; 定义变量需要建立存储空间,如:int b; #include <stdio.h> int main() { //extern 关 ...
- centosflask+uWSGI+nginx部署
centosflask+uWSGI+nginx部署 1. 概念 Flask自带webserver--Werkzeug,可以搭建服务,运行网站.但在开发时,一般会用专业的--uWSGI. 另外 ...
- idea配置jdk,maven,tomcat
1.idea配置jdk 2.idea配置maven 3.idea配置tomcat
- 生成唯一的ID
public class UniqueId { public static String getUUId(){ ; int hashCodeV = UUID.randomUUID().toString ...
- Update(Stage4):Spark Streaming原理_运行过程_高级特性
Spark Streaming 导读 介绍 入门 原理 操作 Table of Contents 1. Spark Streaming 介绍 2. Spark Streaming 入门 2. 原理 3 ...
- EBCDIK,EBCDIC,ASCII,shift JIS間の変換
http://itdoc.hitachi.co.jp/manuals/3020/3020759580/G5950334.HTM#ID01056
- Typescript 实战 --- (8)高级类型
1.交叉类型 将多个类型合并成一个类型,新的类型将具有所有类型的特性,适用于对象混用 语法: 类型1 & 类型2 & 类型3 interface CatInterface { ...