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()方法 等的更多相关文章

  1. 多线程java的concurrent用法详解(转载)

    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...

  2. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  3. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  4. Java的JDBC事务详解

    Java的JDBC事务详解         分类:             Hibernate              2010-06-02 10:04     12298人阅读     评论(9) ...

  5. Java并发关键字Volatile 详解

    Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...

  6. java 8 stream reduce详解和误区

    目录 简介 reduce详解 总结 java 8 stream reduce详解和误区 简介 Stream API提供了一些预定义的reduce操作,比如count(), max(), min(), ...

  7. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  8. Java内存模型(JMM)详解

    在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...

  9. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

随机推荐

  1. Tomcat性能优化

    1.关闭AJP协议 注释以下配置 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPo ...

  2. Entity Framework 杂记

    本系列文章,将介绍本人在学习和使用Entity Framewrok的过程中的收获与心得. 或许有的地方讲的错误 欢迎大家批评指出. 1.EntityFramework 数据库的迁移 2.Mysql 该 ...

  3. 如何保存gnome的linux的 会话?相当于windows下的休眠?

    在关机前, 你进行的所有操作, 的集合, 就叫做你跟 linux系统 机器间的 一次 会话, 一个session. linux 可以 在关机时保存 这些session, 保存这些打开的窗口 和程序. ...

  4. Linux命令-自动挂载文件/etc/fstab功能详解[转]

    一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系统开机时会主动读取/etc/fstab这个文件中的内容 ...

  5. php SESSION跨域问题

    这段时间随着项目功能的扩展,慢慢接触到了跨域方面的知识,遇到的更多的问题也是前端与后端交互的时候跨域问题.关于js跨域的问题我会在其他分类里面写.这里记录我今天遇到的php session跨域问题 当 ...

  6. Xcode 快捷键、常用技巧

    关于iOS开发中的技能快捷键 经常使用鼠标太TM的D疼了,快捷键能大大地提高我们的开发速度,使我们的手指尽情的在键盘上飞舞,优美的代码,哈哈哈,那些常规的复制.粘贴.剪切请自行度娘或者Google一下 ...

  7. 使用php+swoole对client数据实时更新(下)

    上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终 ...

  8. JS心得——判断一个对象是否为空

    判断一个对象是否为空对象,本文给出三种判断方法: 最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数组" 2.通过JSON自带的. ...

  9. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

  10. U3D学习笔记1: HelloWorld

    Unity 版本: 5.3.5.f1 Hello World工程 1.新建工程 HelloWorld U3D可选2D和3D游戏   2.新建C#脚本文件 在project栏的assets目录右键-&g ...