要求:

借助同步机制,sleep()方法,join()方法,实现动画显示;

甲线程:1、3、5、7、9

乙线程:2、4、6、8、10

丙线程:a、b、c、d、e

main()线程输出:线程开始,线程结束

输出结果:线程开始,1-a-2## 3-b-4## 5-c-6## …

思考:

使用多个判断标记,模拟(消费者-生产者)每线程输出一个后就等待,然后改变自己的标记

临界资源–使用多个== putX() == 方法,判断属于自己的标记(== isEmptyX ==)然后输出

使多个线程有序的交替执行

代码:

class Resource{

private boolean isEmpty01 = true;

private boolean isEmpty02 = false;

private boolean isEmpty03 = false;

//每个put方法对应一个输出,每输出一个就等待,等待其他人的唤醒

public void put1(){

while(!isEmpty01){

try{

wait();

}catch(InterruptedException e){

e.printStackTrace();

}

}

//输出后

isEmpty01 = false;

isEmpty02 = true;

notifyAll();

}

public void put2(){

while(!isEmpty02){

try{

wait();

}catch(InterruptedException e){

e.printStackTrace();

}

}

isEmpty02 = false;

isEmpty03 = true;

notifyAll();

}

public void put3(){

while(!isEmpty03){

try{

wait();

}catch(InterruptedException e){

e.printStackTrace();

}

}

isEmpty03 = false;

isEmpty01 = true;

notifyAll();

}

}

class Player01 implements Runnable{

private Resource res;

private String[] arr;

Player01(){}

Player01(String[] arr,Resource res){

this.arr = arr;

this.res = res;

}

public void run(){

synchronized(res){

for(int i=0;i

//错误的点

//61,62,这两句不能交换顺序

res.put1();

System.out.print(arr[i]+"-");

try{

Thread.sleep(1000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

}

}

class Player02 implements Runnable{

private Resource res;

private String[] arr;

Player02(){}

Player02(String[] arr,Resource res){

this.arr = arr;

this.res = res;

}

public void run(){

synchronized(res){

for(int i=0;i

res.put2();

System.out.print(arr[i]+"-");

try{

Thread.sleep(1000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

}

}

class Player03 implements Runnable{

private Resource res;

private String[] arr;

Player03(){}

Player03(String[] arr,Resource res){

this.arr = arr;

this.res = res;

}

public void run(){

synchronized(res){

for(int i=0;i

res.put3();

System.out.print(arr[i]+"## ");

try{

Thread.sleep(1000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

}

}

class Test08{

public static void main(String[] args){

String[] arr1 = {"1","3","5","7","9"};

String[] arr2 = {"a","b","c","d","e"};

String[] arr3 = {"2","4","6","8","0"};

Resource res = new Resource();

Player01 p1 = new Player01(arr1,res);

Player02 p2 = new Player02(arr2,res);

Player03 p3 = new Player03(arr3,res);

Thread t1 = new Thread(p1);

Thread t2 = new Thread(p2);

Thread t3 = new Thread(p3);

t1.start();

t2.start();

t3.start();

}

}

执行结果:

重要的是:

这种利用标记可以实现超过2个线程的有序交替执行

原文:https://blog.csdn.net/qq_42701294/article/details/90321329

java 多线程 交替_java 多线程–线程交替相关推荐

  1. java go多线程:两个线程交替打印 0~100 的奇偶数

    最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...

  2. java 多线程 进程_Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  3. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  4. java线程交替执行_Java synchronized线程交替运行实现过程详解

    背景 用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A--线程二输出1 线程1输出B--线程二输出2 线程1输出C--线程二输出3 以此类 ...

  5. Java多线程复习_Java多线程复习

    一.线程的基本概念 简单的说:线程就是一个程序里不同的执行路径 在同一个时间点上cpu只会有一个线程在执行 Java里的多线程是通过java.lang.Thread类来实现的 每个线程都拥有自己独立的 ...

  6. java多线程代码_java多线程实例代码详解

    原文:http://blog.csdn.net/paranoidyang/article/details/70184523 作者:Paranoidyang 线程与进程的区别 (1)程序是一段静态的代码 ...

  7. java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔

    ***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...

  8. java 多线程 总结_Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  9. java 同步锁_Java多线程:synchronized同步锁的使用和实现原理

    作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...

  10. java 多线程 关键字_java多线程基础(synchronize关键字)

    线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地 ...

最新文章

  1. PMCAFF | 产品经理如何设计敏捷开发流程?
  2. scrapy在命令行指定要采集的url
  3. Linux系统xshell常用指令,linux系统安装数据库时,xshell工具常用MySQL(5.5)相关命令...
  4. myeclipse2014删除antlr-2.7.2.jar--解决struts和hibernate包冲突
  5. shell中的括号(小括号,中括号,大括号/花括号)
  6. m1芯片Mac安装jekyll+搭建GitHub pages个人博客站点
  7. [转] python提取计算结果的最大最小值及其坐标
  8. 前端文档汇总(觉得对您有用的话,别忘了给点个赞哦 ^_^ !)
  9. 5. laravel 路由(2)
  10. Python中常用的一些库
  11. 怎样做sns网站?哪里可下载这类程序?
  12. 最新win10镜像下载
  13. Android Data Binding 初识
  14. python print函数用法_print函数的用法总结
  15. 思科cisco交换机如何查找环路及解决方法
  16. rjs子模板中如何按照顺序并且有序列地执行语句
  17. C++性能优化(十一) —— 内存管理器性能分析
  18. 鸿蒙系统能用wps吗,WPS Office
  19. 在地图上可视化地理空间数据的12种方法
  20. 风口上的低代码:诱人的故事,危险的豪赌

热门文章

  1. knn实战:如何对手写数字进行识别?
  2. 数据可视化(三)- Seaborn简易入门
  3. python3爬虫初探(四)之文件保存
  4. JDK8新特性:函数式接口@FunctionalInterface的使用说明
  5. jersey rest webservice
  6. 大数据将如何重构汽车产业的商业模式?
  7. 微软Build 2017第一天:值得开发者关注的热点
  8. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(10月15日-10月21日)
  9. Ajax+asp.net无刷新验证用户名
  10. Android新增Activity,并实现多Activity之间的切换