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设计模式(17)——行为模式之观察者模式(Observer)
一.概述 概念 UML简图 我们根据一个示例得类图来分析角色 角色 抽象主题:保存观察者聚集(集合),管理(增删)观察者 抽象观察者:定义具体观察者的抽象接口,在得到主题通知后更新自己 具体主题:将有 ...
- python通过mongoengine中connect函数连接多个数据库
mongoengine支持程序同时连接多个数据库,这些数据库可以位于一个或多个mongo之中,通过alias名称区分不同的连接即可. 可以通过switch_db切换到不同的数据库,进行读写操作,swi ...
- springboot之redis的应用
1.redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted se ...
- Visual Studio 起始页中不显示最近使用的项目的解决办法
将 HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer/NoRecentDocsHistory的 ...
- Selenium(Python)调用pywin32上传图片
import unittestfrom time import sleep import osfrom selenium import webdriverimport win32apiimport w ...
- 记录---Testin上新手测试用例设计实战---碎乐3.2.0
平台上给的版本是碎乐3.12版的,但是平台上给的安装包下载不了,所以加群咨询之后给出了直接去手机应用商店下载搜索到的版本的对策.所以就那应用商店中找到的3.2.0版本来设计测试用例.因为任务中没有给出 ...
- Linux命令应用大词典-第23章 进程和服务管理
23.1 ps:报告当前进程的快照 23.2 top:显示当前正在运行的进程 23.3 pgrep:按名称和其他属性查找进程 23.4 pidof:查找正在运行的进程的进程号 23.5 pstree: ...
- HDU - 6444(单调队列+思维)
链接:HDU - 6444 题意:给出一个包含 n 个数的环,每个数都有一个价值,起点任选,每次跳顺时针跳 k 个数,在哪个数就能获得该价值(包括起点),最多取 m 次,问最少需要补充多少价值,所拿的 ...
- TW实习日记:第20-21天
为什么上周五没写呢,因为上周五一直在熟悉业务流程...根本不会写一些复杂的业务代码,因为没有业务流程图!!!在学校的上需求分析和UML建模课的时候,还有软件工程课的时候,想着这都什么鬼啊,听来干嘛,写 ...
- 【system.date】使用说明
对象:system.date 说明:提供一系列针对日期类型的操作 目录: 方法 返回 说明 system.date.isDate( date_string ) [True | False] 判断 ...