热门标签 | 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


推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • Linux系统中Java程序Too Many Open Files问题的深入解析与解决方案
    本文详细分析了在Linux环境下运行的Java应用程序中可能出现的“Too many open files”异常现象,探讨其成因及解决方法。该问题通常出现在高并发文件访问或大量网络连接场景下,对系统性能和稳定性有较大影响。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文探讨了在Java中如何正确地将多个不同的数组插入到ArrayList中,避免所有数组在插入后变得相同的问题。我们将分析代码中的问题,并提供解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 深入解析ArrayList与LinkedList的差异
    本文详细对比了Java中ArrayList和LinkedList两种常用集合类的特性、性能及适用场景,通过代码示例进行测试,并结合实际应用场景分析其优缺点。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
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社区 版权所有