【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等
java实现多线程,有两种方法:
1》实现多线程,继承Thread,资源不能共享
2》实现多线程 实现Runnable接口,可以实现资源共享
*wait()方法 在哪个线程中调用 则当前线程处于等待状态【在main方法中调用A.wait(),则是main线程等待,而不是A线程等待】
* join()方法 作用类似与wait()方法 理解:如上处调用join()方法
* 【注意:在A线程中调用B.join()--------表示A一直等待,直到B运行完成后才继续运行A】
* 在A线程中调用B.join(1000)----表示A仅等待B线程1000ms时间,不管B线程中是否有sleep()或者wait()等情况,只要超时,则A继续运行,B你随意
* notify()方法 无论B.wait()在A线程中运行还是在B线程中运行【在哪个线程中运行,则哪个线程等待】,但是想让那个等待的线程被唤醒,必须用B.notify()唤醒,不管在何处唤醒【即不管在A线程中调用B.notify()或者在main线程中调B.notify()】。
package com.sxd.thread; /**
* 测试 多线程 的wait()
* @author Administrator
*
*/
public class TestThread implements Runnable{ static Thread thread1 = null;
static Thread thread2 = null;
static int count = 20; //用来标识一下 各个线程运行的顺序 public TestThread() { } public static void main(String[] args) throws InterruptedException {
System.out.println("main线程运行---->");
TestThread testThread = new TestThread();
thread1 = new Thread(testThread,"AA");
thread2 = new Thread(testThread,"BB");
thread1.start();
thread2.start();
System.out.println("休眠--->main线程休眠5s");
Thread.sleep(5000);//main线程 睡5s
System.out.println("唤醒--->AA线程");
synchronized (thread1) {
thread1.notify();//唤醒AA线程 因为AA线程让thread1调用的wait,所以需要thread1唤醒
} //BB线程先走 main线程等待2000ms
synchronized (thread2) {
thread2.join(2000);//理解:此处在主线程中: thread2调用join()方法,则main线程暂停运行,直到thread2【调用它的线程对象】运行结束才继续运行main线程
}
System.out.println("等不及BB线程,main线程输出");
} /**
* wait()方法 在哪个线程中调用 则当前线程处于等待状态【在main方法中调用A.wait(),则是main线程等待,而不是A线程等待】
* join()方法 作用类似与wait()方法 理解:如上处调用join()方法
* 注意:在A线程中调用B.join()--------表示A一直等待,直到B运行完成后才继续运行A
* 在A线程中调用B.join(1000)----表示A仅等待B线程1000ms时间,不管B线程中是否有sleep()或者wait()等情况,只要超时,则A继续运行,B你随意
* notify()方法 无论B.wait()在A线程中运行还是在B线程中运行【在哪个线程中运行,则哪个线程等待】,但是想让那个等待的线程被唤醒,必须用B.notify()唤醒,不管在何处唤醒【即不管在A线程中调用B.notify()或者在main线程中调用B.notify()】。
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (TestThread.class) {
System.out.println(Thread.currentThread().getName()+"线程运行"+count--);
} if(i == 2){
if(Thread.currentThread().getName().equals("AA")){//若是AA线程 则让AA进行wait()
synchronized (thread1) {//wait() join() notify() 这类方法 都需要synchronized
try {
System.out.println("等待--->AA开始等待");
thread1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
if(i == 3){
if(Thread.currentThread().getName().equals("BB")){//若是BB线程 则让BB睡眠5000ms
try {
System.out.println("休眠--->BB线程进入休眠");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
代码流程:
运行结果:
【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等的更多相关文章
- 多线程java的concurrent用法详解(转载)
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...
- java.lang.Thread类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- Java的JDBC事务详解
Java的JDBC事务详解 分类: Hibernate 2010-06-02 10:04 12298人阅读 评论(9) ...
- Java并发关键字Volatile 详解
Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...
- java 8 stream reduce详解和误区
目录 简介 reduce详解 总结 java 8 stream reduce详解和误区 简介 Stream API提供了一些预定义的reduce操作,比如count(), max(), min(), ...
- Java中日志组件详解
avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...
- Java内存模型(JMM)详解
在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
随机推荐
- 利用AOP与ToStringBuilder简化日志记录
刚学spring的时候书上就强调spring的核心就是ioc和aop blablabla...... IOC到处都能看到...AOP么刚开始接触的时候使用在声明式事务上面..当时书上还提到一个用到ao ...
- [c#基础]关于try...catch最常见的笔试题
引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...
- spring MVC 尝试传参json(应用部分)
spring 3.1后增加新的注解:@Requestbody,@Responsebody, 暂不论Requestdody, 若想让后端代码直接返回json字符串,可使用@Responsebody, 用 ...
- ASP.NET 验证码控件
public class ValidateCode : WebControl { /// <summary> /// 默认构造函数,暴露的属性接口 /// </summary> ...
- 在SQL中 给字符串补0方法
--第一种方法SELECT RIGHT('00000'+CAST(ID AS nvarchar(50)),5) FROM dbo.TableName --左边补0,如 00001,00039 SELE ...
- Gedit 解决中文显示乱码问题
详细请参考:http://wiki.ubuntu.org.cn/Gedit%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81 具体原因是Gedit的默认编码设置没有添加中文编码所 ...
- word20161221
S/MIME, Secure Multipurpose Internet Mail Extensions / 安全多用途网际邮件扩展协议 SACL, system access control lis ...
- 阿里云部署nodejs服务器(windows)
花了大半个月做的网站终于要上线了,周围的同学们很多都在使用阿里云的服务器,我也入手了一台.考虑到自己不是很适应ubuntu的命令行界面,于是买了个windows的,上网搜了一下,似乎都是用linux来 ...
- C语言 插入排序 算法导论chapter2
#include <stdio.h> #define N 10 //INSERTION-SORT int main() { ,,,,,,,,,}; int key; ;j<N;j++ ...
- CentOS添加用户并加入sudo权限
# 新增用户 useradd username # 设置密码 passwd username # 加入sudo ## 打开sudo配置文件 visudo ## 找到下面这两行,并在下面新增红色部分 # ...