半路出家学习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的使用的更多相关文章

  1. java notify和notifyAll的区别

    首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁. notify不能保证获得锁的线程,真正需要锁,并且可能产生死锁. 举例1: 所有人(消费者线程) ...

  2. java notify notifyAll

    notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法. void notify(): 唤醒一个正在等待该对象的线程.void notifyAll(): 唤醒所 ...

  3. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  4. javasE--基础部分--线程

    Day23 本单元目标 一.线程的相关概念  二.线程的创建和启动★ 三.线程的停止 四.线程的常用方法 五.线程的生命周期★  六.线程的同步 七.线程的通信 八.线程的创建方式三 九.线程的创建方 ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. 如何在 Java 中正确使用 wait, notify 和 notifyAll(转)

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...

  7. java多线程wait notify join

    wait notify 几个注意点: wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁. 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进 ...

  8. 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用

    一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ...

  9. 【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等

    java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程  实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前 ...

随机推荐

  1. Java和JDK版本的关系

    JAVA的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2.到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继 ...

  2. 北京Uber优步司机奖励政策(1月3日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. CF813D Two Melodies(dp)

    题面 luogu Codeforces 题目大意: 给一个长度为\(n\)的序列,求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么相差\(1\)或者相差 ...

  4. 华为LiteOS系统使用-任务调度函数-第一篇

    1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...

  5. Linux命令应用大词典-第30章 审计系统

    30.1 auditctl:控制内核的审计系统 30.2 aureport:生成审计信息报表 30.3 ausearch:搜索审计记录 30.4 autrace:跟踪指定进程 30.5 audit-v ...

  6. Python-S9——Day82-CRM项目实战

    1.权限的概念: 2.RBAC的设计: 3.注册登录用户所有权限到session中: 4.权限的校验: 5.基于中间件的权限校验: 1.权限的概念: 1.1 项目与应用: Project App 1. ...

  7. [JSON].valueOf( keyPath )

    语法:[JSON].valueOf( keyPath ) 返回:[任意类型 | null] 说明:获取键名路径原值,它保留原始值的类型 示例: b = sysFile.binary("tes ...

  8. 【form】 表单组件说明

    form表单组件 1)将form组件内的用户输入的<switch/> <input/> <checkbox/> <slider/> <radio/ ...

  9. linux学习总结----shell编程

    ## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...

  10. Python全栈 进阶(进阶内容都在这了)

    原文地址 https://yq.aliyun.com/articles/632754?spm=a2c4e.11155435.0.0.23eb3312feB6dG ................... ...