Java notify的使用
半路出家学习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和notifyAll的区别
首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁. notify不能保证获得锁的线程,真正需要锁,并且可能产生死锁. 举例1: 所有人(消费者线程) ...
- java notify notifyAll
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法. void notify(): 唤醒一个正在等待该对象的线程.void notifyAll(): 唤醒所 ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- javasE--基础部分--线程
Day23 本单元目标 一.线程的相关概念 二.线程的创建和启动★ 三.线程的停止 四.线程的常用方法 五.线程的生命周期★ 六.线程的同步 七.线程的通信 八.线程的创建方式三 九.线程的创建方 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 如何在 Java 中正确使用 wait, notify 和 notifyAll(转)
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...
- java多线程wait notify join
wait notify 几个注意点: wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁. 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进 ...
- 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用
一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ...
- 【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等
java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程 实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前 ...
随机推荐
- Java和JDK版本的关系
JAVA的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2.到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继 ...
- 北京Uber优步司机奖励政策(1月3日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- CF813D Two Melodies(dp)
题面 luogu Codeforces 题目大意: 给一个长度为\(n\)的序列,求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么相差\(1\)或者相差 ...
- 华为LiteOS系统使用-任务调度函数-第一篇
1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...
- Linux命令应用大词典-第30章 审计系统
30.1 auditctl:控制内核的审计系统 30.2 aureport:生成审计信息报表 30.3 ausearch:搜索审计记录 30.4 autrace:跟踪指定进程 30.5 audit-v ...
- Python-S9——Day82-CRM项目实战
1.权限的概念: 2.RBAC的设计: 3.注册登录用户所有权限到session中: 4.权限的校验: 5.基于中间件的权限校验: 1.权限的概念: 1.1 项目与应用: Project App 1. ...
- [JSON].valueOf( keyPath )
语法:[JSON].valueOf( keyPath ) 返回:[任意类型 | null] 说明:获取键名路径原值,它保留原始值的类型 示例: b = sysFile.binary("tes ...
- 【form】 表单组件说明
form表单组件 1)将form组件内的用户输入的<switch/> <input/> <checkbox/> <slider/> <radio/ ...
- linux学习总结----shell编程
## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...
- Python全栈 进阶(进阶内容都在这了)
原文地址 https://yq.aliyun.com/articles/632754?spm=a2c4e.11155435.0.0.23eb3312feB6dG ................... ...