【多线程】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的各种成分映射成 ...
随机推荐
- ORA-01722:无效数字
今天写查询语句,关联多张表,出现了这个错误. 结果发现时字段的数据类型不一致. select * from table_a a,table_b b where to_char(a.project_id ...
- 使用 Weinre 调试移动网站及 PhoneGap 应用
在 PC 端,我们可以使用 Firebug 或者 Chrome 开发人员工具方便的调试网站或者 Web 应用.但是,当我们想在移动端调试站点或者应用的时候,这些工具就派不上用场了.因此,移动开发人员都 ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
- MySQL自增ID 起始值 修改方法
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法. 通常的设置自增字段的方法: 创建表格时 ...
- 软工实践——github文件整理
软工实践中,整理github上文件遇到的一些问题 先扔github链接Transcend/ActivityHelper 1.原来呢我们团队的github上的文件的安排十分凌乱,没有归档.把说明文档.源 ...
- Java Native Interface 四--JNI中引用类型
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- Android学习资料收集
1.Android 学习之路 http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/
- powershell批量设置权限
批量设置权限 $acl=get-acl .\demo Get-ChildItem .\Documents -Recurse -Force|Set-Acl -AclObject $acl
- Debian 8.3 中文字体安装
有了这个字体,对于日常工作和生活而言已经非常足够了.如果你还需要更多中文字体的话,推荐可以安装“文泉驿正黑”,“文泉驿点阵宋体”等.文泉驿的安装包已经进入了 Debian/Ubuntu,直接安装 tt ...