热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java多线程协作

Java编程思想一书中第21章并发中关于线程间协作的一节中有个关于汽车打蜡与抛光的小例子(原书的704页)。这个例子主要展示的是两个线程如何通过wait

Java编程思想一书中第21章并发中关于线程间协作的一节中有个关于汽车打蜡与抛光的小例子(原书的704页)。这个例子主要展示的是两个线程如何通过wait与notify/notifyAll方法waxOn的Flag让打蜡线程与抛光线程依次顺序反复运行。

class Car {private boolean waxOn = false;synchronized void waxed() {waxOn = true;System.out.println("waxOn = true");notify();}synchronized void buffed() {System.out.println("waxOn = false");waxOn = false;notify();}synchronized void waitForWaxing() {try {while (!waxOn) {wait();}} catch (InterruptedException e) {e.printStackTrace();}}synchronized void waitBuffing() {try {while (waxOn) {wait();}} catch (InterruptedException e) {e.printStackTrace();}}}

class WaxOn implements Runnable {private Car car;WaxOn(Car car) {this.car = car;}@Overridepublic void run() {while (!Thread.interrupted()) {car.waitBuffing();car.waxed();}}
}

class WaxOff implements Runnable {private Car car;WaxOff(Car car) {this.car = car;}@Overridepublic void run() {while (!Thread.interrupted()) {car.waitForWaxing();car.buffed();}}
}

public class Test {public static void main(String[] args) {Car car = new Car();ExecutorService executorService = Executors.newCachedThreadPool();executorService.execute(new WaxOn(car));executorService.execute(new WaxOff(car));try {TimeUnit.MILLISECONDS.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}executorService.shutdownNow();}
}

waxOn = true
waxOn = false
waxOn = true
waxOn = false
waxOn = true
waxOn = false

新浪的一道笔试题

1、有一个数组存储了 0 ~ 19 这20个数字;
2、有三个线程的名字分别是Thread0,Thread1,Thread2;
3、启动这三个线程顺序的从数组中取出一个数字打印出来;

要求:
1、Thread0 必须第一个获取数据打印;
2、同一时刻只有一个线程在运行;
3、线程的执行是有顺序的 Thread0->Thread1->Thread2->Thread0->Thread1->Thread2

abstract class Step {int allSteps;int stepNow;abstract public void doStep(int threadIndex);abstract public void waitForPreStep(int stepNow) throws InterruptedException;
}

class WaitStep extends Step{private int totalNum &#61; 0;&#64;Overridepublic synchronized void doStep(int threadIndex) {if (stepNow &#61;&#61; allSteps) {stepNow &#61; 0;} else {&#43;&#43; stepNow;}if (totalNum <20) {System.out.println("Thread :" &#43; threadIndex &#43; " num:" &#43; totalNum &#43;&#43;);}notifyAll();}&#64;Overridepublic synchronized void waitForPreStep(int stepN) throws InterruptedException {while (stepN !&#61; stepNow) {wait();}}
}

class RunnableTest implements Runnable {private int threadIndex;private Step step;RunnableTest(int index, Step step) {this.threadIndex &#61; index;this.step &#61; step;}&#64;Overridepublic void run() {int runTime &#61; 20;while (runTime -- > 0) {try {step.waitForPreStep(this.threadIndex);} catch (InterruptedException e) {e.printStackTrace();}step.doStep(this.threadIndex);}}
}

public class Test {public static void main(String[] args) {WaitStep waitStep &#61; new WaitStep();waitStep.stepNow &#61; 0;waitStep.allSteps &#61; 2;ExecutorService executorService &#61; Executors.newCachedThreadPool();executorService.execute(new RunnableTest(0, waitStep));executorService.execute(new RunnableTest(1, waitStep));executorService.execute(new RunnableTest(2, waitStep));executorService.shutdown();}
}

运行结果&#xff1a;

Thread :0 num:0
Thread :1 num:1
Thread :2 num:2
Thread :0 num:3
Thread :1 num:4
Thread :2 num:5
Thread :0 num:6
Thread :1 num:7
Thread :2 num:8
Thread :0 num:9
Thread :1 num:10
Thread :2 num:11
Thread :0 num:12
Thread :1 num:13
Thread :2 num:14
Thread :0 num:15
Thread :1 num:16
Thread :2 num:17
Thread :0 num:18
Thread :1 num:19


推荐阅读
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 本文介绍了读写锁(RWMutex)的基本概念、实现原理及其在Go语言中的应用。读写锁允许多个读操作并发执行,但在写操作时确保互斥,从而提高并发性能。 ... [详细]
  • 深入理解Java多线程与并发机制
    本文探讨了Java多线程和并发机制的核心概念,包括多线程类的分类、执行器框架、并发容器及控制工具。通过详细解析这些组件,帮助开发者更好地理解和应用多线程技术。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 本文探讨了Java中线程的多种终止方式及其状态转换,提供了关于如何安全有效地终止线程的指导。 ... [详细]
  • 本文将探讨如何在 Struts2 中使用 ActionContext 和 ServletActionContext 来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
author-avatar
jiangzh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有