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(); } }
发表评论
-
仿真[汽车制造]
2012-02-13 01:26 684class Car{ private final i ... -
生产者消费者[简单示例]
2012-02-09 21:38 658class Meal{ private final ... -
泛型[创建类型实例]
2012-02-06 01:01 738public Class Erased<T> ... -
多路分发3
2012-02-05 23:16 828使用常量相关的方法 常量相关的方法允许我们为每个 ... -
多路分发2[使用enum分发]
2012-02-05 18:09 1902直接将RoShamBo1.java翻译为基于enum的版 ... -
多路分发
2012-02-05 02:06 1382多路分发 Number.plus(Number) ... -
使用Enum的自动贩卖机
2012-02-04 13:52 922public enum Input { NICKEL ... -
使用enum的责任链
2012-02-04 12:39 1178package enumerated; impor ... -
枚举类Enum,EnumSet,EnumMap
2012-02-04 02:00 1421EnumSet与HashSet相比,非常快。 p ... -
枚举类enum
2012-02-03 15:00 904一般来说,我们希望每个美剧实例能够返回对自身的描述, ... -
类的简化历[从内部类到匿名内部类]
2012-02-02 12:41 634Version1: public class DirL ... -
持有引用java.lang.ref 和 WeakHashMap
2012-02-02 01:27 981Thinking in java P554 持 ... -
Collections快速报错 fial-fast
2012-02-02 00:46 787{ public static void main( ... -
散列HashCode
2012-02-01 14:04 704散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键 ... -
使用散列数据结构注意点
2012-02-01 01:32 590Goundhog自动继承基类Object,所以这里使用 ... -
Set注意点
2012-02-01 01:31 308如果我们尝试着将没有恰当支持不许的操作的类型用于需要这些 ... -
享元Map
2012-01-30 00:28 381这里之所以叫享元,注意static关键字。 定制了Entry ... -
深入容器Map
2012-01-19 15:12 398Map生成器 对Map的使用相同的方式,需要一 ... -
深入容器List
2012-01-19 14:40 342一种Generator解决方案: 所有Collect ... -
泛型数组
2012-01-19 00:57 637不能创建泛型数组,但能通过转型来赋予 public cl ...
相关推荐
在这个例子中,awaitTest方法中的线程会因为调用了condition.await()而阻塞等待,直到signalTest方法中的线程调用condition.signalAll()后才能继续执行。 三、sleep()用法 sleep()是Thread类中的静态方法,当线程...
- `void signal()`: 唤醒等待在该`Condition`上的一个线程,将其从等待队列移动到同步队列,如果这个线程在同步队列中成功获取锁,那么它将从`await()`方法返回。 - `void signalAll()`: 唤醒所有等待在该`...
本项目"winform_c#_多线程例子"显然是一个演示如何在Winform应用中正确使用多线程的示例。 多线程允许应用程序同时执行多个不同的任务,提高程序的并发性和效率。在Winform中,主线程主要负责用户界面的交互,而...
7. **异步编程模型**:C# 4.0及更高版本引入了`async`和`await`关键字,它们提供了一种更简洁的异步编程方式,可以避免复杂的线程管理,提高程序的可读性和性能。 `ThreadExample3`可能是包含一个具体多线程示例的...
下面将详细讲解三个C#线程的例子,以帮助理解如何在C#中管理和使用线程。 ### 例子1:后台线程(Background Thread) 在C#中,可以通过`System.Threading.Thread`类创建一个新的线程。以下是一个简单的后台线程...
`Task`和`async/await`是.NET 4.0及更高版本引入的异步编程模型,它们简化了多线程编程,并且提高了程序的响应性。在这个例子中,可以使用`Task.Run`将摇奖操作异步化,这样主线程(通常是UI线程)不会被阻塞,可以...
总结,线程例子(c#代码编写)涵盖了C#中的线程创建、管理、同步和异步编程等多个核心知识点。理解和熟练运用这些技术,可以构建出高效、稳定的多线程应用程序。在实际开发中,要根据具体需求选择合适的方式,并注意...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的工具和机制来创建和管理线程。本篇将深入探讨微软C#中的多线程实例,帮助你理解如何在实践中应用多线程。 首先,让我们...
`Task.Run`可以将工作调度到后台线程,而`async/await`关键字则简化了异步代码的编写。 7. **线程优先级**:每个线程都有一个优先级,但过度依赖优先级可能导致优先级反转和死锁,因此应谨慎使用。 8. **线程池**...
在 ConditionWait 中,我们可以使用 lock.lock() 方法获取锁,然后使用 condition.await() 方法使当前线程进入等待队列并释放锁,同时线程状态变为等待状态。当从 await() 方法返回时,当前线程一定获取了 Condition...
- **async/await关键字**:C# 5.0引入,用于异步编程,使代码更易读,`await`关键字用于等待异步操作完成。 通过这个C# WinForm多线程模板示例,开发者可以学习到如何优雅地处理后台任务,保持UI响应,并理解多...
6. **异步编程与Task**:C# 5.0及以后版本引入了异步编程模型,通过`async`和`await`关键字,可以编写更简洁、更易于理解和维护的多线程代码。尽管`Task`不是直接用于多线程,但常用于异步操作,可与线程配合使用...
本例子重点介绍了如何利用`System.Timers.Timer`组件来实现这样的多线程操作,特别是针对网段ping功能的实现。`System.Timers.Timer`是一个异步定时器,它在单独的线程上触发`Elapsed`事件,避免了阻塞UI线程。 ...
C# 4.0引入了`async`和`await`关键字,简化了异步编程。异步方法使用`Task`或`Task<T>`作为返回类型,允许主线程在等待异步操作完成时继续执行其他工作。 九、线程安全 为了确保在多线程环境中正确操作共享数据,...
在编程领域,线程是程序执行的...以上就是关于"C#线程例子"的主要知识点,理解和掌握这些概念将有助于你编写高效、稳定的多线程应用。在实际开发中,应根据具体情况选择合适的线程管理策略,确保程序的正确性和性能。
8. **async/await**:异步编程模式虽然不是传统的线程同步技术,但它可以帮助开发者编写非阻塞代码,从而避免过度使用线程导致的资源浪费。 在实际编程中,选择合适的线程同步技术取决于具体的需求。例如,如果需要...
在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者能够高效地...本教程中的例子将为你提供宝贵的实践经验,帮助你成为一个熟练的多线程开发者。
以下是一个简单的线程创建和启动的例子: ```csharp using System.Threading; protected void Page_Load(object sender, EventArgs e) { // 创建一个新的线程 Thread myThread = new Thread(new ThreadStart...
在这个例子中,`testMethod()`中的线程在调用`condition.await()`后会释放锁并等待,直到其他线程调用`signalMethod()`唤醒它。这种基于条件的等待和唤醒机制使得线程间的协作更为灵活。 总的来说,`ReentrantLock`...
本示例"自己做的一个C#线程的例子"将深入探讨如何在C#中创建和管理线程。 在C#中,我们主要使用`System.Threading`命名空间来操作线程。`Thread`类是这个命名空间的核心,它提供了创建、启动、暂停、恢复和终止线程...