一、线程间的通信
1、wait,notify
两个要结合使用,必须放在synchronized代码块或方法中,采用对象锁进行wait,notify
public class WaitNotifyTest {
private volatile List<String> list = new ArrayList<String>();
public void add() {
list.add("1");
}
public int size() {
return list.size();
}
public static void main(String[] args) {
final Object object = new Object();
final WaitNotifyTest test = new WaitNotifyTest();
Thread thread1 = new Thread(new Runnable() {
public void run() {
synchronized (object) {
System.out.println(Thread.currentThread().getName());
for (int i=0; i<10; i++) {
test.add();
if (test.size() == 5) {
object.notify();
System.out.println("唤醒t2线程");
}
}
}
}
}, "t1");
Thread thread2 = new Thread(new Runnable() {
public void run() {
synchronized (object) {
if (test.size() != 5) {
try {
System.out.println("---开始等待");
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("---" + Thread.currentThread().getName());
}
}
}, "t2");
thread2.start();
thread1.start();
}
我先启动thread2线程,他先拿到锁,然后到逻辑,发现条件不满足,调用锁wait()释放锁,开始等待,然后thread1拿到锁之后,开始添加元素,到条件满足,调用锁的notify()去唤醒thread2,但是thread1不会释放自己锁,两个线程还存在竞争拿锁。
使用:wait,notify必须配合synchronized关键字使用
wait()会释放锁,notify()不会释放锁
public class QuenueTest {
// 往一个集合中添加元素,take get
public static volatile List<String> quene = new ArrayList<String>();
public volatile int MAX_NUMBER = 5;
public volatile int MIN_NUMBER = 0;
public static AtomicInteger size = new AtomicInteger(5);
Object lock = new Object();
public void put(String string) {
synchronized (lock) {
while (size.get() == MAX_NUMBER) {
try {
System.out.println("等待添加");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
quene.add(string);
size.incrementAndGet();
lock.notify();
System.out.println("--添加");
}
}
public String take() {
synchronized (lock) {
while (size.get() == MIN_NUMBER) {
try {
System.out.println("等待取出");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String string = quene.remove(0);
size.decrementAndGet();
lock.notify();
System.out.println("--取出");
return string;
}
}
public static void main(String[] args) {
quene.add("1");
quene.add("2");
quene.add("3");
quene.add("4");
quene.add("5");
final QuenueTest test = new QuenueTest();
Thread thread = new Thread(new Runnable() {
public void run() {
test.put("6");
test.put("7");
}
});
thread.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread thread1 = new Thread(new Runnable() {
public void run() {
test.take();
test.take();
}
});
thread1.start();
}
}
通过wait(),notify()模拟一个队列,设置最大、最小值,put,take的判断
2、ThreadLocal
转载于:https://my.oschina.net/u/2504766/blog/758170
分享到:
相关推荐
在这个特定的“线程三个随机数”示例中,我们可能遇到的是一个利用多线程技术来生成并显示三个独立随机数的场景。这通常涉及到并发编程和随机数生成的知识点。 首先,让我们讨论线程。在单线程程序中,所有操作按...
MFC MultiThread(多线程三个实例)This file contains a summary of what you will find in each of the files that make up your MultiThread11 application.
论文利用多核处理器所带来的硬件性能和面向对象技术所带来的开发效率的提升,将并行并发同面向对象技术融合,实现了面向对象的多线程并行实时三维引擎。新的实时三维引擎既具有面向对象特征,又使程序并行运行变得容易...
三、并发控制 * 锁(Lock):用于保护共享资源 * 使用Monitor类来实现锁 * 使用lock语句来实现锁 四、线程的信号机制 * 使用EventWaitHandle类来实现线程的信号机制 * 使用WaitOne()方法来等待信号 * 使用Set()...
本案例探讨的是如何利用“三缓冲区”和多线程技术来实现高效的抓包处理,特别是在Linux环境中,结合libpcap库进行网络数据包捕获。以下是关于这个主题的详细解释。 首先,让我们理解“三缓冲区”的概念。在单线程...
Java创建线程三种方式的优缺点 Java创建线程主要有三种方式:继承Thread类创建线程、实现Runnable接口创建线程和实现Callable和Future创建线程。每种方式都有其优缺点,在实际开发中,选择合适的方式非常重要。 ...
JavaSE的多线程编程是Java程序设计中的一个重要部分,它允许程序同时执行多个任务,提高应用程序的效率和响应性。本教程主要讲解了Java中关于线程等待、唤醒以及生产者-消费者问题的实现。 1. **线程等待、唤醒机制...
Linux 线程机制可以分为用户级线程、轻量级进程和内核线程三个方面。用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,不需要特定的内核支持。在这里,操作系统往往会提供一...
在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而...
Java多线程三种主要实现方式解析 Java多线程三种主要实现方式解析是Java编程语言中最重要的概念之一。在 Java 中,实现多线程有多种方式,本文将详细介绍 Java 中的三种主要实现方式:继承Thread类、实现Runnable...
例如,进程A可以有线程一、线程二和线程三,它们都访问同一个用户地址空间,但各自执行不同的任务。 线程机制主要有以下几种类型: 1. 用户级线程:线程管理完全由用户空间的线程库完成,操作系统不直接参与。当一...
【多线程在三维场景中的应用】 在三维场景的渲染和可视化中,多线程技术是一种重要的优化手段,尤其在处理大规模数据时,能够显著提升性能和用户体验。本报告主要探讨了多线程如何应用于三维场景的实时可视化,以及...
三、用户界面线程 用户界面线程(User Interface Thread)主要负责处理用户的输入和显示界面更新。MFC的主窗口类,如CFrameWnd或CDialog,都是在主线程中创建和管理的,因此用户界面线程通常是主线程。为了保持界面...
本实验“三个线程交错输出”旨在探讨和展示如何在Java环境中实现线程间的交互和交错打印,以此来理解线程的并发行为。 首先,我们要明白进程与线程的概念。一个进程是操作系统分配资源的基本单位,它包含了运行中的...
#### 三、CWinThread类详解 ##### 3.1 CWinThread类介绍 在MFC中,`CWinThread` 类是用来表示线程的基础类,它是所有线程的父类。通过继承 `CWinThread` 可以创建自己的线程类,并且可以通过调用 `CreateThread` ...
《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...
《JAVA线程第三版》是Java并发编程领域的一本经典著作,主要针对Java线程的深入理解和实践提供了详尽的指导。这本书详细介绍了如何在Java应用程序中有效地使用多线程,以提高程序的性能和可扩展性。Java线程是Java...
《JAVA线程(第三版)》是一本深入探讨Java多线程编程的权威书籍,针对Java线程的管理和优化提供了详尽的解析。线程在现代计算机编程中扮演着至关重要的角色,尤其是在并发处理和高性能应用中。Java以其强大的线程...
在Java编程语言中,创建和启动线程有多种方法,主要分为三种常见的方式。下面将详细探讨这三种启动线程的方法及其优缺点。 1. 继承Thread类 Java允许我们通过继承Thread类来创建一个新的线程。在子类中重写Thread类...