java 多线程 交替_java 多线程–线程交替
要求:
借助同步机制,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 多线程–线程交替相关推荐
- java go多线程:两个线程交替打印 0~100 的奇偶数
最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...
- java 多线程 进程_Java多线程1:进程与线程概述
进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...
- java的多线程机制_Java多线程开发(一)| 基本的线程机制
0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...
- java线程交替执行_Java synchronized线程交替运行实现过程详解
背景 用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A--线程二输出1 线程1输出B--线程二输出2 线程1输出C--线程二输出3 以此类 ...
- Java多线程复习_Java多线程复习
一.线程的基本概念 简单的说:线程就是一个程序里不同的执行路径 在同一个时间点上cpu只会有一个线程在执行 Java里的多线程是通过java.lang.Thread类来实现的 每个线程都拥有自己独立的 ...
- java多线程代码_java多线程实例代码详解
原文:http://blog.csdn.net/paranoidyang/article/details/70184523 作者:Paranoidyang 线程与进程的区别 (1)程序是一段静态的代码 ...
- java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔
***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...
- java 多线程 总结_Java 多线程总结
昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...
- java 同步锁_Java多线程:synchronized同步锁的使用和实现原理
作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...
- java 多线程 关键字_java多线程基础(synchronize关键字)
线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地 ...
最新文章
- PMCAFF | 产品经理如何设计敏捷开发流程?
- scrapy在命令行指定要采集的url
- Linux系统xshell常用指令,linux系统安装数据库时,xshell工具常用MySQL(5.5)相关命令...
- myeclipse2014删除antlr-2.7.2.jar--解决struts和hibernate包冲突
- shell中的括号(小括号,中括号,大括号/花括号)
- m1芯片Mac安装jekyll+搭建GitHub pages个人博客站点
- [转] python提取计算结果的最大最小值及其坐标
- 前端文档汇总(觉得对您有用的话,别忘了给点个赞哦 ^_^ !)
- 5. laravel 路由(2)
- Python中常用的一些库
- 怎样做sns网站?哪里可下载这类程序?
- 最新win10镜像下载
- Android Data Binding 初识
- python print函数用法_print函数的用法总结
- 思科cisco交换机如何查找环路及解决方法
- rjs子模板中如何按照顺序并且有序列地执行语句
- C++性能优化(十一) —— 内存管理器性能分析
- 鸿蒙系统能用wps吗,WPS Office
- 在地图上可视化地理空间数据的12种方法
- 风口上的低代码:诱人的故事,危险的豪赌
热门文章
- knn实战:如何对手写数字进行识别?
- 数据可视化(三)- Seaborn简易入门
- python3爬虫初探(四)之文件保存
- JDK8新特性:函数式接口@FunctionalInterface的使用说明
- jersey rest webservice
- 大数据将如何重构汽车产业的商业模式?
- 微软Build 2017第一天:值得开发者关注的热点
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(10月15日-10月21日)
- Ajax+asp.net无刷新验证用户名
- Android新增Activity,并实现多Activity之间的切换