- 浏览: 361956 次
- 性别:
- 来自: 四川
文章分类
- 全部博客 (247)
- 数据库以及sql (11)
- java (48)
- 爬虫学习 (20)
- java编程 (28)
- python编程以及安装和配置 (27)
- oracle数据库 (32)
- mongodb基本操作 (4)
- linux学习 (7)
- easyUI (2)
- nodeJs (8)
- python学习 (16)
- 其他 (13)
- hadoop (1)
- svn (1)
- 汉字 (1)
- windows (2)
- jsp (5)
- fiddler (1)
- ETL (1)
- teamviewer (1)
- maven (4)
- GIT (2)
- datagrip (1)
- ocr (1)
- redis (3)
- mysql (3)
- linux (1)
- 数据服务 (0)
最新评论
package com.kai.多线程间的通信;
import java.util.ArrayList;
import java.util.List;
/**
* 重点说明:
* 1.实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用
* 2.lock.wait(); 等待,并且释放锁
* 3.lock.notify(); 唤醒,不释放锁
* */
public class ListAdd2 {
private volatile static List list = new ArrayList();
public void add(){
list.add("bjsxt");
}
public int size(){
return list.size();
}
public static void main(String[] args) {
final ListAdd2 list2 = new ListAdd2();
//实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用
final Object lock = new Object();
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
list2.add();
System.out.println("当前线程:"+Thread.currentThread().getName()+ "添加了一个元素");
Thread.sleep(500);
if(list2.size()==5){
System.out.println("size==5,已发出通知");
//线程唤醒,但是并不释放锁, 所以,等t1线程执行完毕, t2线程才能得到锁,继续执行
lock.notify();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
if(list2.size()!=5){
try {
//线程等待,并且释放锁
lock.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("当前线程收到通知:"+Thread.currentThread().getName()+ "list.size==5线程停止");
throw new RuntimeException();//抛出运行时异常
}
}
},"t2");
//t2先执行,等待,释放锁
t2.start();
//t1在t2释放锁后执行,当list.size==5时唤醒t2线程,但是这个时候并没有释放锁,
//所以t2必须等t1执行完毕后才能得到锁,继续执行
t1.start();
}
}
执行流程:
1.t2先执行,等待,释放锁
2.t1在t2释放锁后执行,当list.size==5时唤醒t2线程,但是这个时候并没有释放锁,继续add().
3.t1执行完毕后,释放锁.
4.t2得到锁继续执行
运行结果:
import java.util.ArrayList;
import java.util.List;
/**
* 重点说明:
* 1.实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用
* 2.lock.wait(); 等待,并且释放锁
* 3.lock.notify(); 唤醒,不释放锁
* */
public class ListAdd2 {
private volatile static List list = new ArrayList();
public void add(){
list.add("bjsxt");
}
public int size(){
return list.size();
}
public static void main(String[] args) {
final ListAdd2 list2 = new ListAdd2();
//实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用
final Object lock = new Object();
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
list2.add();
System.out.println("当前线程:"+Thread.currentThread().getName()+ "添加了一个元素");
Thread.sleep(500);
if(list2.size()==5){
System.out.println("size==5,已发出通知");
//线程唤醒,但是并不释放锁, 所以,等t1线程执行完毕, t2线程才能得到锁,继续执行
lock.notify();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
if(list2.size()!=5){
try {
//线程等待,并且释放锁
lock.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("当前线程收到通知:"+Thread.currentThread().getName()+ "list.size==5线程停止");
throw new RuntimeException();//抛出运行时异常
}
}
},"t2");
//t2先执行,等待,释放锁
t2.start();
//t1在t2释放锁后执行,当list.size==5时唤醒t2线程,但是这个时候并没有释放锁,
//所以t2必须等t1执行完毕后才能得到锁,继续执行
t1.start();
}
}
执行流程:
1.t2先执行,等待,释放锁
2.t1在t2释放锁后执行,当list.size==5时唤醒t2线程,但是这个时候并没有释放锁,继续add().
3.t1执行完毕后,释放锁.
4.t2得到锁继续执行
运行结果:
发表评论
-
是什么java多态
2018-11-14 13:43 591Java多态 例1.1+1=2 例2."1&quo ... -
经纬度转换
2018-09-25 13:57 0package com.teamdev.jxbrowser.c ... -
java连接池技术
2018-09-04 14:26 320转:https://www.cnblogs.com/xdp-g ... -
java 提取url字符串中的域名
2018-08-30 15:24 7280package com.teamdev.jxbrowser.c ... -
java多线程间的通信实例
2018-07-13 11:00 1329----线程间的通信 public class ListAd ... -
volatile关键字
2018-07-12 11:20 581volatile:使变量在多个线程间可见 public c ... -
java根据百度url获取真正的网页地址
2018-07-09 11:26 918/** * 根据百度url,获取原本url * @th ... -
java中的base64字符流与图片的相互转换
2018-06-29 13:27 1178//base64字符串转化成图片 public sta ... -
java去除图片水印的解决办法
2018-06-28 10:54 3181原文地址:http://www.oicqzone.com/pc ... -
java中的中文字符转URLEncode
2018-06-26 11:26 733String urlTypeName =java.net.UR ... -
java下载图片到本地实例
2018-06-25 15:34 1295public static void main(String[ ... -
Myeclipse中如何更改jsp默认的打开方式
2018-05-04 17:44 5631.打开myeclipse 2.点击上方的 window-&g ... -
java三大范式
2018-05-02 09:50 678参考地址:https://www.cnblogs.com/ja ... -
请求中设置代理IP
2018-04-18 16:24 887(不能直接JVM设置代理 System.getProperti ... -
java获取当前时间的时间戳
2018-04-08 09:25 1412package com.teamdev.jxbrowser.c ... -
java四种线程池实例 (kaigege)
2018-03-28 11:03 641Java通过Executors提供四种线程池: 1.newCa ... -
java获取IP地址(windos,linux)皆可
2018-03-28 09:44 726package com.teamdev.jxbrowser.c ... -
post 请求
2018-02-05 16:32 471public static void trustEveryo ... -
java robot控制鼠标和键盘(笔记本中打印 i love you)(滑动)
2018-01-25 16:57 2024package robot_java; import jav ... -
java ascii转中文(ascii转utf-8)清测好用
2018-01-24 17:41 2862package com.teamdev.jxbrowser.c ...
相关推荐
1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized...7. Java多线程学习(六)Lock锁的使用 8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八)线程池与Executor 框架
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、使用ThreadLocal 2.Executor:ExecutorService和Future 3.阻塞队列:put和take、offer和poll、drainTo 4.线程间通信:lock、condition、wait、notify...
分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发中容易踩的坑,受过的伤害。我不会告诉你什么是爱情,但是我会告诉你爱过。 一 基础: 1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3...
多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: – wait:线程挂起,收到notify通知后继续运行 – notify:通知其他线程, 解除其它线程的wai状态 – ...
采用同步机制synchronized/wait(notify)或者lock(unlock)/condition variable实现两个producer和一个consumer之间协调运行。运行结果输出格式为:Put(or Get) number {[content] length start_index end_index} 包含...
使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类...
多线程锁 并发下的集合类 List Set Map Callable接口 线程创建的方式 callable / runnable FutureTask JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ...
60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...
8.1.2 在Eclipse中使用包 194 8.1.3 天上掉下个package 197 8.1.4 包带来了什么? 197 8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 ...
第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:11:07分钟 | 第51节并发容器ConcurrentHashMap原理与使用00:38:22分钟 | 第52节线程池的原理与使用00:42:49分钟 | 第53节...
8.1.2 在Eclipse中使用包 194 8.1.3 天上掉下个package 197 8.1.4 包带来了什么? 197 8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 ...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:11:07分钟 | 第51节并发容器ConcurrentHashMap原理与使用00:38:22分钟 | 第52节线程池的原理与使用00:42:49分钟 | 第53节...
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...
连最基本的资源释放都做不好,还谈什么多线程编程. 6.EJB规范规定EJB中禁止的操作有哪些?(15分) 共有8点,答出下列3-4点得满分. 1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等) 2....
目前我们已经会使用Lock去对公共资源进行互斥访问了,也探讨了同一线程可以使用RLock去重入锁,但是尽管如此我们只不过才处理了一些程序中简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题。...
│ 高并发编程第二阶段17讲、多线程读写锁分离设计模式讲解-中.mp4 │ 高并发编程第二阶段18讲、多线程读写锁分离设计模式讲解-下.mp4 │ 高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上.mp4 │...
│ 高并发编程第二阶段17讲、多线程读写锁分离设计模式讲解-中.mp4 │ 高并发编程第二阶段18讲、多线程读写锁分离设计模式讲解-下.mp4 │ 高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上.mp4 │...