- 浏览: 375108 次
- 性别:
- 来自: 四川
文章分类
- 全部博客 (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 694Java多态 例1.1+1=2 例2."1&quo ... -
经纬度转换
2018-09-25 13:57 0package com.teamdev.jxbrowser.c ... -
java连接池技术
2018-09-04 14:26 382转:https://www.cnblogs.com/xdp-g ... -
java 提取url字符串中的域名
2018-08-30 15:24 7383package com.teamdev.jxbrowser.c ... -
java多线程间的通信实例
2018-07-13 11:00 1426----线程间的通信 public class ListAd ... -
volatile关键字
2018-07-12 11:20 648volatile:使变量在多个线程间可见 public c ... -
java根据百度url获取真正的网页地址
2018-07-09 11:26 1076/** * 根据百度url,获取原本url * @th ... -
java中的base64字符流与图片的相互转换
2018-06-29 13:27 1268//base64字符串转化成图片 public sta ... -
java去除图片水印的解决办法
2018-06-28 10:54 3353原文地址:http://www.oicqzone.com/pc ... -
java中的中文字符转URLEncode
2018-06-26 11:26 797String urlTypeName =java.net.UR ... -
java下载图片到本地实例
2018-06-25 15:34 1357public static void main(String[ ... -
Myeclipse中如何更改jsp默认的打开方式
2018-05-04 17:44 6581.打开myeclipse 2.点击上方的 window-&g ... -
java三大范式
2018-05-02 09:50 759参考地址:https://www.cnblogs.com/ja ... -
请求中设置代理IP
2018-04-18 16:24 972(不能直接JVM设置代理 System.getProperti ... -
java获取当前时间的时间戳
2018-04-08 09:25 1505package com.teamdev.jxbrowser.c ... -
java四种线程池实例 (kaigege)
2018-03-28 11:03 716Java通过Executors提供四种线程池: 1.newCa ... -
java获取IP地址(windos,linux)皆可
2018-03-28 09:44 811package com.teamdev.jxbrowser.c ... -
post 请求
2018-02-05 16:32 530public static void trustEveryo ... -
java robot控制鼠标和键盘(笔记本中打印 i love you)(滑动)
2018-01-25 16:57 2100package robot_java; import jav ... -
java ascii转中文(ascii转utf-8)清测好用
2018-01-24 17:41 3018package com.teamdev.jxbrowser.c ...
相关推荐
在Java中,多线程允许程序同时执行多个任务,提高CPU的利用率,而锁则是用来控制多线程间共享资源的访问,确保数据的一致性和完整性。 一、Java多线程 1. **线程创建方式** - 继承Thread类:自定义类继承Thread类...
Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,Java 5引入了BlockingQueue阻塞队列,它是一种线程安全的数据结构,...
为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...
在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...
Java中的Lock锁是用于解决多线程访问共享资源时的同步问题的。Lock锁可以分为两种:独占锁和共享锁。独占锁允许多个线程访问同一个资源,但是同一时刻只能有一个线程可以访问该资源。共享锁允许多个线程同时访问同一...
Java提供了wait(), notify()和notifyAll()方法,这些方法用于在线程间交换信息,但必须在同步块中使用,以防止死锁和其他并发问题。此外,还有java.util.concurrent工具包,包含如BlockingQueue等高级并发结构,它们...
本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...
首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置的锁,当多个线程尝试访问同一对象的同步方法或同步代码块时,只有一个线程能够获取到这个锁并执行,其他线程则必须等待。这就是Java的互斥锁机制,用于...
3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...
Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...
1. wait()、notify()和notifyAll():这三个方法用于线程间的通信,它们必须在同步环境中使用。 2. Condition接口:配合Lock使用,提供更灵活的线程间通信方式。 五、线程池 1. Executor框架:Java 5引入的...
1. wait()、notify()和notifyAll():这三个方法用于线程间的通信,但必须在synchronized代码块或方法中使用,否则会抛出IllegalMonitorStateException。 2. 生产者消费者模型:使用wait()和notify()实现线程间的协作...
Java提供了wait()、notify()和notifyAll()方法,这些方法与synchronized配合使用,可以在对象的等待池中唤醒或通知其他线程。另外,java.util.concurrent包中的BlockingQueue是一个高效的线程间通信工具,它可以安全...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **Thread类**:Java中的`Thread`类是线程的基础,它代表了程序中的一个执行流。创建一个新的线程通常有两种方式:...
- **线程间通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的协作,需要在同步块或方法中使用。 3. **线程池** - **Executor框架**:`ExecutorService`、`ThreadPoolExecutor`和`Executors`工厂类...
同步机制是Java多线程中解决竞态条件的关键,主要包含`synchronized`关键字、`Lock`接口及其实现类、`wait()`和`notify()`等方法。`synchronized`可以保证同一时刻只有一个线程访问特定的代码块,防止数据的不一致。...
另外,wait()、notify()和notifyAll()方法用于线程间的通信,但它们必须在同步块或方法中使用,以确保正确唤醒等待的线程。 Java还引入了Lock接口和相关的实现,如ReentrantLock,提供比synchronized更细粒度的控制...
本示例着重探讨如何在Java中实现和管理多线程,以及它带来的挑战和解决方案。 一、Java多线程基础 1. 创建线程: - 继承Thread类:创建一个新的类,继承自Thread类,重写其run()方法,然后创建该类的实例并调用...
在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。 一、创建线程 1. 继承Thread类:创建一个新的类,该类继承自Thread类,并重写其run()方法。实例化这个新类的对象并调用start()方法,即可...