`
vortexchoo
  • 浏览: 66104 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

线程的阻塞及唤醒

    博客分类:
  • java
阅读更多

demo:

 

为方便展示,这里有两个类 : Tasker 、Customer

 

在Customer中,其构造器需要传入Tasker对象,这样我们才能在后面的代码中捕获当前tasker对象,并唤醒该对象等待的线程。

 

public class Tasker implements Runnable{

	public void doSth() throws InterruptedException{
		synchronized (this) {
			for (int i = 0; i < 10; i++) {
				if(i==5){
					this.wait();
				}
				System.out.println("i = " + i);
			}
		}
	}
	
	public void wake(){
		//唤醒对象
		System.out.println("start to wake up");
		this.notifyAll();
		System.out.println("wake up finished");
	}
	
	@Override
	public void run() {
		//获取对象唤醒对象
		synchronized(this){
			this.wake();
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		Tasker t = new Tasker();
		Customer cust = new Customer(t);
		new Thread(cust).start();
		Thread.sleep(3000);
		new Thread(t).start();
		
	}
	
}

 

public class Customer implements Runnable {
	
	private Tasker tasker;
	
	public Customer(Tasker tasker){
		this.tasker = tasker;
	}
	
	public void doSth() throws InterruptedException{
		tasker.doSth();
	}

	@Override
	public void run() {
		try {
			doSth();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	
}

 从main方法解读:

声明一个tasker对象并交给声明的customer,customer启动线程,调用当前tasker的doSth方法。该方法线程在执行到某条件处wait()。另一方面,当前对象tasker自己也启动线程,调用自己的wake方法。wake方法唤醒了该对象的所有等待线程。doSth方法执行完毕! jdk中要求,唤醒其他线程的代码需写在 同步方法或同步块中。

分享到:
评论

相关推荐

    java 同步阻塞并唤醒指定线程

    在特定情况下,我们可能需要唤醒某个被阻塞的线程,以便它能够继续执行。让我们深入探讨这些概念以及如何在Java中实现它们。 首先,同步可以通过多种机制来实现,包括`synchronized`关键字、`java.util.concurrent`...

    实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)

    在标题和描述中提到的“实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)”是一个典型的并发编程问题,涉及到线程管理和通信。以下是对这个主题的详细讲解: 1. **线程与并发**: - 线程是程序执行的最小...

    唤醒阻塞休眠线程示例

    标题“唤醒阻塞休眠线程示例”和描述“如何唤醒或者退出被阻塞,休眠的线程,非TerminateXXX方法”提示我们要探讨的是如何优雅地管理线程状态,而不是粗暴地终止它们。下面将详细介绍相关知识点: 1. **线程状态**...

    线程的挂起、唤醒和终止

    在Java中,可以使用`Thread.suspend()`方法来挂起线程,但需要注意,这个方法会使得线程陷入阻塞状态,直到被其他线程唤醒。然而,`Thread.suspend()`和相应的`Thread.resume()`方法已不推荐使用,因为它们可能导致...

    支持多线程和泛型的阻塞队列

    4. **阻塞与唤醒机制**:在`push()`和`pop()`等方法中使用条件变量来实现阻塞和唤醒操作。 ### 应用场景 阻塞队列在许多并发编程场景中都有应用,例如: 1. **线程池**:任务调度器将任务放入队列,工作线程从...

    Java线程唤醒与阻塞常用方法共2页.pdf.zip

    线程的唤醒与阻塞是控制并发执行和资源调度的核心机制。本文将深入探讨Java中用于线程唤醒与阻塞的常用方法,以及它们在实际编程中的应用。 1. **线程的阻塞** - `wait()`: 这个方法属于`Object`类,当一个线程...

    多线程及线程同步

    如果有,则当前线程会被阻塞,直到其他线程退出临界区。临界区内部的代码确保同一时间只有一个线程执行,从而避免了竞态条件。在Windows系统中,可以使用`EnterCriticalSection`和`LeaveCriticalSection`函数来定义...

    C#多线程C#线程及访问杂记

    - **阻塞(Blocked)**:线程因等待I/O操作、锁定或其他原因而暂停。 - **挂起(Suspended)**:线程被暂停,但可恢复执行。 - **终止(Terminated)**:线程已完成执行或被强制停止。 5. **线程通信** - **...

    线程及多线程的详细讲解

    如果线程处于睡眠状态,则可以唤醒线程。 - `isInterrupted()`:判断当前线程是否被中断。 - `isAlive()`:判断线程是否处于运行状态。 - `destroy()`:终止一个线程,但不清理相关资源。 - `sleep(long millis)`:...

    Java多线程机制(讲述java里面与多线程有关的函数)

    线程的生命周期始于新建,通过调用start()方法进入就绪状态,然后可能进入运行、阻塞或等待,最后在run()方法执行完毕后死亡。 9.2 Thread的子类创建线程: 创建线程的一种方式是创建Thread类的子类,并重写run()...

    线程异步工作,当一个线程结束时异步通知另一线程

    总之,线程异步工作和线程间的异步通知是多线程编程中的重要概念,通过合理使用C++11及更高版本提供的并发工具,可以构建高效且响应迅速的多线程应用程序。正确理解和运用这些工具,能够帮助开发者优化系统性能,...

    利用事件实现多线程同步

    线程会阻塞等待事件被设置,当事件状态改变时,等待的线程会被唤醒。 2. **生产者-消费者模型**: 在这个模型中,生产者线程负责生成数据,而消费者线程负责处理这些数据。事件可以作为生产者和消费者之间的通信桥梁...

    java线程同步及通信

    当一个线程正在执行被同步的方法时,其他试图访问该方法的线程会被阻塞,直到当前线程执行完毕。`Synch.java`的`main`方法中,通过`join()`方法确保`ob1`、`ob2`和`ob3`线程按照创建的顺序执行,这也是线程同步的一...

    线程同步及数据结构

    3. **条件变量(Condition Variable)**:线程可以在特定条件下等待,当条件满足时由其他线程唤醒。常与互斥量配合使用,用于实现复杂同步逻辑。 4. **读写锁(Read-Write Lock)**:允许多个读线程同时访问资源,...

    易语言线程挂起与恢复.rar

    这一操作通常用于线程调度,当挂起的线程的优先级提升或系统资源状况允许时,可以使用“恢复线程”命令来唤醒线程,使其重新加入到可执行线程队列中。这样可以保证程序的运行效率,避免线程长时间阻塞导致的资源浪费...

    JAVA多线程模型详解

    本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞与唤醒机制等,旨在为初学者提供一个清晰的多线程概念理解和使用指南。 一、线程与进程的区别 在...

    Java线程:线程状态的转换

    3. **阻塞**:线程尝试获取一个已被其他线程锁定的锁时进入阻塞状态。 #### 四、示例代码分析 以下是一段简单的示例代码,展示了如何通过调用`Thread.sleep()`方法来控制线程的执行速度: ```java public class ...

    Java工程师线程试题

    4. **线程状态**:线程有多种状态,包括新建、可运行、阻塞、等待、唤醒、运行和死亡。当线程调用`sleep()`、`wait()`或被其他线程中断(`interrupt()`)时,会进入阻塞或等待状态。当线程执行结束或被唤醒时,可能从...

    多线程的运用e语言多线程 e多线程

    2. 条件变量(Condition Variable):用于线程间通信,当满足特定条件时,一个线程可以唤醒另一个线程。 3. 信号量(Semaphore):控制对共享资源的访问数量,超过设定值时,其他线程将被阻塞。 四、线程优缺点 ...

Global site tag (gtag.js) - Google Analytics