半路出家学习java, 花了几分钟简单看了。在早上那个例子上稍微改了下,

notify 对象上必须使用 synchronized

我的理解是在java synchronized只是个线程同步标志,但是不会堵塞线程,而wait会堵塞调用者线程,类windows的堵塞函数,而notify相当于解锁(个人把它当成windows开发的event来理解的, wait 相当于 resertevent加 WaitForSingleObject 挂起线程,  对象相当于event, notify相当于 setevent),下边例子主要是,默认先运行的线程test1会先执行, 我稍微改了下, 让第一个线程挂起,等第二个线程执行完,再执行第一个线程

代码

import java.util.concurrent.CountDownLatch;

public class CountDown {

private static CountDownLatch connectedSignal = new CountDownLatch(50);

static class MyThread implements Runnable {

public void run() {

Thread current = Thread.currentThread();

System.out.println(current.getName());

synchronized (connectedSignal) {

Thread thread = Thread.currentThread();

String name = thread.getName();

if (name.equals("test1")){

try {

connectedSignal.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

for (int i = 0; i < 25; ++i) {

sale();

}

if (name.equals("test2")){

connectedSignal.notify();

}

}

}

public synchronized void sale() {

if (connectedSignal.getCount() > 0) {

Thread current = Thread.currentThread();

connectedSignal.countDown();

System.out.println("Thread id" + current.getId() + "value = "

+ connectedSignal.getCount());

}

}

}

public static void main(String[] args) throws InterruptedException {

MyThread my = new MyThread();

Thread t1 = new Thread(my, "test1");

Thread t2 = new Thread(my, "test2");

t1.start();

t2.start();

connectedSignal.await(); // 等待结束

System.out.println(connectedSignal.getCount());

}

}

又花了几分钟稍微改了下, 让两个线程轮流执行

import java.util.concurrent.CountDownLatch;

public class CountDown {

private static CountDownLatch connectedSignal = new CountDownLatch(50);

static class MyThread implements Runnable {

public void run() {

Thread current = Thread.currentThread();

System.out.println(current.getName());

synchronized (connectedSignal) {

Thread thread = Thread.currentThread();

String name = thread.getName();

//if (name.equals("test1")){

//try {

//connectedSignal.wait();

//} catch (InterruptedException e) {

TODO Auto-generated catch block

//e.printStackTrace();

//}

//}

for (int i = 0; i < 25; ++i) {

if (name.equals("test1") && (i % 2 == 0)){

try {

sale();

connectedSignal.notify();

connectedSignal.wait();

connectedSignal.notify();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

else{

sale();

connectedSignal.notify();

try {

connectedSignal.wait();

connectedSignal.notify();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//if (name.equals("test2")){

//connectedSignal.notify();

//}

}

}

public synchronized void sale() {

if (connectedSignal.getCount() > 0) {

Thread current = Thread.currentThread();

connectedSignal.countDown();

System.out.println("Thread id" + current.getId() + "value = "

+ connectedSignal.getCount());

}

}

}

public static void main(String[] args) throws InterruptedException {

MyThread my = new MyThread();

Thread t1 = new Thread(my, "test1");

Thread t2 = new Thread(my, "test2");

t1.start();

t2.start();

connectedSignal.await(); // 等待结束

System.out.println(connectedSignal.getCount());

}

}

结果和我想的一样。感觉本身线程使用挺简单的,java估计是为了开发者更方便开发, 自己封装再提供了更多的功能,反倒让我很不习惯。

wait线程之间的等待,waitFor线程等待进程.

纯粹本人观点, 有错误欢迎指出.

java notify 用法_Java notify的使用相关推荐

  1. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  2. java notify 唤醒_java notify()的唤醒

    在线程等待的间隙,其他的线程会进行唤醒的操作,这时候我们要用的notify()方法来进行处理.当notify()结束线程的唤醒工作,才会进行下一步的wait方法,也就是说notify()也可以结合wa ...

  3. java future用法_Java中的多线程知识点

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  4. java printwriter用法_Java中printwriter类的用法 | 学步园

    printwriter类: java.io 类 PrintWriter java.lang.Object java.io.Writer java.io.PrintWriter 所有已实现的接口: Cl ...

  5. java treemap用法_Java TreeMap put()用法及代码示例

    TreeMap的java.util.TreeMap.put()方法用于将映射插入Map.这意味着我们可以将特定的键及其映射到的值插入到特定的映射中.如果传递了现有键,则以前的值将被新值替换.如果传递了 ...

  6. java return用法_Java枚举的高级用法之多键值的映射使用

    枚举Enum单映射使用 做Java的各位仁兄姐妹都知道,Java通过HashMap,以及枚举提供了方便的K-V映射功能,例如 枚举单映射使用 但是如果遇到多个键值映射,例如K-K-V的形式怎么办呢?可 ...

  7. java foreach用法_Java十大简单性能优化

    以下是Java中最容易进行的10个性能优化: 1.使用StringBuilder 这几乎是所有Java代码中的默认设置.尽量避免+操作员.当然,您可能会争辩说它StringBuilder无论如何都是语 ...

  8. java list用法_java list的用法详解

    java list的用法详解 java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中.以下是百分网小编搜索整理的关于java list的用法详解,需要的朋友可以参考一下!想了解更多相关 ...

  9. java instanceof用法_Java基础高频面试题汇总(1.4W字详细解析)

    注:由于公众号文章推送规则的改变,所以为了大家能够准时收到我们的文章推送,请记得将公众号:JAVA编程语言 设为星标-这样就不会错过每一篇精彩的推送啦~ 1. Java语言有哪些特点 (1)简单易学. ...

最新文章

  1. [C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍
  2. 10.1引用数据类型的转换
  3. 前端vscode常用插件
  4. html获取qq头像代码,jQuery在线获取QQ名称和头像
  5. docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...
  6. mysql关系模式怎么画_关系数据库与mysql
  7. Android Studio 选项菜单和动画结合_Android 应用与iOS 应用之间的设计差异对比!
  8. DataBseDesign工作笔记001---基于RBAC用户权限管理数据库设计_用图的形式说明_精确到页面的元素
  9. 超越Hadoop的大数据分析之图形处理尺寸
  10. 单CPU环境中如何实现多进程并行工作?
  11. Unity写lua代码的vs插件:BabeLua
  12. TCL语言编译器安装及使用
  13. 修复Word打开文档默认显示两页的问题
  14. 菜鸡的求学之路-JavaScript
  15. linux c led 驱动程序,uclinux简单LED驱动程序
  16. TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数
  17. 高德地图ajax距离,高德地图 API 计算两个城市之间的距离
  18. python学习总结报告第一期
  19. svc预测概率_Kaggle平台Titanic生存率预测项目(TOP3%)
  20. Kubernetes调度之亲和性和反亲和性

热门文章

  1. android 7.0拍照
  2. vue循环 数组对象 和 对象
  3. 网络营销:企业该如何个对网站“定位”?
  4. 国产蓝牙耳机哪些牌子性价比高?不容错过的国产蓝牙耳机推荐
  5. arduino几种供电方式 附加多9g舵机驱动 2021 8 24
  6. 承诺书合同的效力是怎样的
  7. PhotoShop学习笔记(一):PhotoShop获得商品背景为透明图的图片
  8. 直博与硕博连读的优劣
  9. 简易的ATM银行系统(Java)
  10. android学习的app,Android相见恨晚的6款学习APP,每天坚持学习,提升自我