`
racingbird
  • 浏览: 23685 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程例子[Condition, SignlAll, await]

 
阅读更多

package concurrency.waxomatic;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Car2{
	private Lock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private boolean waxOn = false;
	public void waxed(){
		lock.lock();
		try {
			waxOn = true;	// Ready to buff;
			condition.signalAll();
		} finally {
			lock.unlock();
		}
	}
	public void buffed(){
		lock.lock();
		try{
			waxOn = false;	// Ready for another coat of wax
			condition.signalAll();
		}finally{
			lock.unlock();
		}
	}
	public void waitForWaxing() throws InterruptedException{
		lock.lock();
		try{
			while(waxOn == false){
				condition.await();
			}
		}finally{
			lock.unlock();
		}
	}
	public void waitForBuffing() throws InterruptedException{
		lock.lock();
		try{
			while(waxOn == true)
				condition.await();
		}finally{
			lock.unlock();
		}
	}
}

class WaxOn2 implements Runnable{
	private Car car;
	public WaxOn2(Car c){
		car  = c;
	}
	public void run(){
		try {
			while(!Thread.interrupted()){
				System.out.println("Wax on! ");
				TimeUnit.MILLISECONDS.sleep(200);
				car.waxed();
				car.waitForBuffing();
			}
		} catch (InterruptedException e) {
			System.out.println("Exiting via interrupt");
		}
		System.out.println("Ending Wax On task");
	}
}

class WaxOff2 implements Runnable{
	private Car car;
	public WaxOff2(Car c){
		car = c;
	}
	public void run(){
		try {
			while(!Thread.interrupted()){
				car.waitForWaxing();
				System.out.println("Wax Off! ");
				TimeUnit.MILLISECONDS.sleep(200);
				car.buffed();
			}
		} catch (InterruptedException e) {
			System.out.println("Exiting via interrupt");
		}
		System.out.println("Ending Wax Off task");
	}
}
public class WaxOMatic2 {
	public static void main(String[] args) throws InterruptedException {
		Car car = new Car();
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new WaxOff(car));
		exec.execute(new WaxOn(car));
		TimeUnit.SECONDS.sleep(5);
		exec.shutdownNow();
	}
}
 
分享到:
评论

相关推荐

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    在这个例子中,awaitTest方法中的线程会因为调用了condition.await()而阻塞等待,直到signalTest方法中的线程调用condition.signalAll()后才能继续执行。 三、sleep()用法 sleep()是Thread类中的静态方法,当线程...

    Java学习资料-详解Condition的await和signal等待/通知机制

    - `void signal()`: 唤醒等待在该`Condition`上的一个线程,将其从等待队列移动到同步队列,如果这个线程在同步队列中成功获取锁,那么它将从`await()`方法返回。 - `void signalAll()`: 唤醒所有等待在该`...

    winform_c#_多线程例子

    本项目"winform_c#_多线程例子"显然是一个演示如何在Winform应用中正确使用多线程的示例。 多线程允许应用程序同时执行多个不同的任务,提高程序的并发性和效率。在Winform中,主线程主要负责用户界面的交互,而...

    多线程例子 C#

    7. **异步编程模型**:C# 4.0及更高版本引入了`async`和`await`关键字,它们提供了一种更简洁的异步编程方式,可以避免复杂的线程管理,提高程序的可读性和性能。 `ThreadExample3`可能是包含一个具体多线程示例的...

    三个C#线程的例子三个C#线程的例子三个C#线程的例子

    下面将详细讲解三个C#线程的例子,以帮助理解如何在C#中管理和使用线程。 ### 例子1:后台线程(Background Thread) 在C#中,可以通过`System.Threading.Thread`类创建一个新的线程。以下是一个简单的后台线程...

    .net摇奖机线程例子

    `Task`和`async/await`是.NET 4.0及更高版本引入的异步编程模型,它们简化了多线程编程,并且提高了程序的响应性。在这个例子中,可以使用`Task.Run`将摇奖操作异步化,这样主线程(通常是UI线程)不会被阻塞,可以...

    线程例子(c#代码编写)

    总结,线程例子(c#代码编写)涵盖了C#中的线程创建、管理、同步和异步编程等多个核心知识点。理解和熟练运用这些技术,可以构建出高效、稳定的多线程应用程序。在实际开发中,要根据具体需求选择合适的方式,并注意...

    微软的C#多线程例子

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的工具和机制来创建和管理线程。本篇将深入探讨微软C#中的多线程实例,帮助你理解如何在实践中应用多线程。 首先,让我们...

    简单的多线程例子==MutipleThread

    `Task.Run`可以将工作调度到后台线程,而`async/await`关键字则简化了异步代码的编写。 7. **线程优先级**:每个线程都有一个优先级,但过度依赖优先级可能导致优先级反转和死锁,因此应谨慎使用。 8. **线程池**...

    3.1.5.并发工具的使用以及原理1

    在 ConditionWait 中,我们可以使用 lock.lock() 方法获取锁,然后使用 condition.await() 方法使当前线程进入等待队列并释放锁,同时线程状态变为等待状态。当从 await() 方法返回时,当前线程一定获取了 Condition...

    C# winform多线程模板示例,winform多线程例子,C#

    - **async/await关键字**:C# 5.0引入,用于异步编程,使代码更易读,`await`关键字用于等待异步操作完成。 通过这个C# WinForm多线程模板示例,开发者可以学习到如何优雅地处理后台任务,保持UI响应,并理解多...

    C#多线程排序例子

    6. **异步编程与Task**:C# 5.0及以后版本引入了异步编程模型,通过`async`和`await`关键字,可以编写更简洁、更易于理解和维护的多线程代码。尽管`Task`不是直接用于多线程,但常用于异步操作,可与线程配合使用...

    关于winform使用timer进行多线程操作的例子

    本例子重点介绍了如何利用`System.Timers.Timer`组件来实现这样的多线程操作,特别是针对网段ping功能的实现。`System.Timers.Timer`是一个异步定时器,它在单独的线程上触发`Elapsed`事件,避免了阻塞UI线程。 ...

    线程例子(C#源代码编写)

    C# 4.0引入了`async`和`await`关键字,简化了异步编程。异步方法使用`Task`或`Task<T>`作为返回类型,允许主线程在等待异步操作完成时继续执行其他工作。 九、线程安全 为了确保在多线程环境中正确操作共享数据,...

    C# 线程例子

    在编程领域,线程是程序执行的...以上就是关于"C#线程例子"的主要知识点,理解和掌握这些概念将有助于你编写高效、稳定的多线程应用。在实际开发中,应根据具体情况选择合适的线程管理策略,确保程序的正确性和性能。

    c#线程同步的典型例子

    8. **async/await**:异步编程模式虽然不是传统的线程同步技术,但它可以帮助开发者编写非阻塞代码,从而避免过度使用线程导致的资源浪费。 在实际编程中,选择合适的线程同步技术取决于具体的需求。例如,如果需要...

    C#多线程教程,学习多线程的例子

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者能够高效地...本教程中的例子将为你提供宝贵的实践经验,帮助你成为一个熟练的多线程开发者。

    Asp.Net 线程小例子

    以下是一个简单的线程创建和启动的例子: ```csharp using System.Threading; protected void Page_Load(object sender, EventArgs e) { // 创建一个新的线程 Thread myThread = new Thread(new ThreadStart...

    java多线程系列(四)ReentrantLock的使用.docx

    在这个例子中,`testMethod()`中的线程在调用`condition.await()`后会释放锁并等待,直到其他线程调用`signalMethod()`唤醒它。这种基于条件的等待和唤醒机制使得线程间的协作更为灵活。 总的来说,`ReentrantLock`...

    自己做的一个C#线程的例子

    本示例"自己做的一个C#线程的例子"将深入探讨如何在C#中创建和管理线程。 在C#中,我们主要使用`System.Threading`命名空间来操作线程。`Thread`类是这个命名空间的核心,它提供了创建、启动、暂停、恢复和终止线程...

Global site tag (gtag.js) - Google Analytics