java notify 用法_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的使用相关推荐
- java list用法_Java List 用法详解及实例分析
Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...
- java notify 唤醒_java notify()的唤醒
在线程等待的间隙,其他的线程会进行唤醒的操作,这时候我们要用的notify()方法来进行处理.当notify()结束线程的唤醒工作,才会进行下一步的wait方法,也就是说notify()也可以结合wa ...
- java future用法_Java中的多线程知识点
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- java printwriter用法_Java中printwriter类的用法 | 学步园
printwriter类: java.io 类 PrintWriter java.lang.Object java.io.Writer java.io.PrintWriter 所有已实现的接口: Cl ...
- java treemap用法_Java TreeMap put()用法及代码示例
TreeMap的java.util.TreeMap.put()方法用于将映射插入Map.这意味着我们可以将特定的键及其映射到的值插入到特定的映射中.如果传递了现有键,则以前的值将被新值替换.如果传递了 ...
- java return用法_Java枚举的高级用法之多键值的映射使用
枚举Enum单映射使用 做Java的各位仁兄姐妹都知道,Java通过HashMap,以及枚举提供了方便的K-V映射功能,例如 枚举单映射使用 但是如果遇到多个键值映射,例如K-K-V的形式怎么办呢?可 ...
- java foreach用法_Java十大简单性能优化
以下是Java中最容易进行的10个性能优化: 1.使用StringBuilder 这几乎是所有Java代码中的默认设置.尽量避免+操作员.当然,您可能会争辩说它StringBuilder无论如何都是语 ...
- java list用法_java list的用法详解
java list的用法详解 java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中.以下是百分网小编搜索整理的关于java list的用法详解,需要的朋友可以参考一下!想了解更多相关 ...
- java instanceof用法_Java基础高频面试题汇总(1.4W字详细解析)
注:由于公众号文章推送规则的改变,所以为了大家能够准时收到我们的文章推送,请记得将公众号:JAVA编程语言 设为星标-这样就不会错过每一篇精彩的推送啦~ 1. Java语言有哪些特点 (1)简单易学. ...
最新文章
- [C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍
- 10.1引用数据类型的转换
- 前端vscode常用插件
- html获取qq头像代码,jQuery在线获取QQ名称和头像
- docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...
- mysql关系模式怎么画_关系数据库与mysql
- Android Studio 选项菜单和动画结合_Android 应用与iOS 应用之间的设计差异对比!
- DataBseDesign工作笔记001---基于RBAC用户权限管理数据库设计_用图的形式说明_精确到页面的元素
- 超越Hadoop的大数据分析之图形处理尺寸
- 单CPU环境中如何实现多进程并行工作?
- Unity写lua代码的vs插件:BabeLua
- TCL语言编译器安装及使用
- 修复Word打开文档默认显示两页的问题
- 菜鸡的求学之路-JavaScript
- linux c led 驱动程序,uclinux简单LED驱动程序
- TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数
- 高德地图ajax距离,高德地图 API 计算两个城市之间的距离
- python学习总结报告第一期
- svc预测概率_Kaggle平台Titanic生存率预测项目(TOP3%)
- Kubernetes调度之亲和性和反亲和性