操作系统课程设计:实现进程间的同步。 有问题留言

import java.util.concurrent.Semaphore; /******** 信号量 *******/ class Sign { final static int NUMS = 6; // 进程的数目 final static int RUN = 1; // 运行完 final static int STOP = 0; // 阻塞态 static int[] status = new int[NUMS]; // 进程的状态 不运行 则阻塞 默认为禁止 static Semaphore s[] = null; // 信号量 final static int[] times = new int[6]; //运行的次数 static Semaphore mutex = new Semaphore(1);// 信号量:控制对临界区的访问 static { s = new Semaphore[NUMS]; for (int i = 0; i < NUMS; i++) { s[i] = new Semaphore(1); // 初始化 } for (int j = 0; j < times.length; j++) { times[j] = 10; // 每个进程执行10次则结束 } } } /*********线程***********/ class process6 implements Runnable {// 进程线程 private int id; public process6(int id) { super(); this.id = id; } void test(int id) throws InterruptedException { // 测试当前进程是否可以运行 // 当自己没有运行,前置条件满足时 可以运行 switch (id) { case 0: if (Sign.times[0] > 0) { Sign.s[0].release(); Sign.times[0]--; System.out.println("I am thread P" + (id + 1) + "。。。。。" + Sign.times[id]); } ; break; case 1: if (Sign.status[0] == Sign.RUN && Sign.times[1] > 0) { // 如果进程1 // 已经运行完,进程2可以直接运行 Sign.s[1].release(); Sign.times[1]--; System.out.println("I am thread P" + (id + 1) + "。。。。。" + Sign.times[id]); } ; break; case 2: if (Sign.status[0] == Sign.RUN && Sign.times[2] > 0) { // 如果进程1 // 已经开启,进程3可以直接运行 Sign.s[2].release(); Sign.times[2]--; System.out.println("I am thread P" + (id + 1) + "。。。。。" + Sign.times[id]); } ; break; case 3: if (Sign.status[1] == Sign.RUN && Sign.times[3] > 0) { // 如果进程2已经开启,进程4可以直接运行 Sign.s[3].release(); Sign.times[3]--; System.out.println("I am thread P" + (id + 1) + "。。。。。" + Sign.times[id]); } ; break; case 4: if (Sign.times[4] > 0 && (Sign.status[1] == Sign.RUN || Sign.status[2] == Sign.RUN)) {// 如果进程2、或3已经运行完,进程5可以直接运行 Sign.s[4].release(); Sign.times[4]--; System.out.println("I am thread P" + (id + 1) + "。。。。。" + Sign.times[id]); } ; break; case 5: if (Sign.times[5] > 0 && (Sign.status[4] == Sign.RUN || Sign.status[3] == Sign.RUN)) {// 如果进程4或5已经运行完,进程6可以直接运行 Sign.s[5].release(); Sign.times[5]--; System.out.println("I am thread P" + (id + 1) + "。。。。。" + Sign.times[id]); } ; break; } } void print() {// 打印 每个进程的状态 for (int i = 0; i < Sign.NUMS; i++) { System.out.println("Thread P" + (i + 1) + " :" + Sign.status[i]); } } @Override public void run() { try { while (true) { // print(); //先打印全部进程状态 Sign.mutex.acquire(); // System.out.println("P" + id + " is testing!"); test(id); Sign.mutex.release(); // 判断当前进程运行的状况,不能运行 则 阻塞 Sign.s[id].acquire(); // 唤醒其他进程 不能运行 则阻塞 if (Sign.times[id] == 0 || Sign.times[id] < 0) { Sign.status[id] = Sign.RUN; // System.out.println("P" + (id+1) + " run out!"); Sign.mutex.acquire(); test((id + 1) % 6); test((id + 2) % 6); test((id + 3) % 6); test((id + 4) % 6); test((id + 5) % 6); Sign.mutex.release(); } else { // System.out.println(+"前置条件不够!"); Thread.currentThread().sleep((100)); } } } catch (Exception e) { e.printStackTrace(); } } } public class SYSV { /** * 任务3 进程/线程同步 */ public static void main(String[] args) { new Thread(new process6(0)).start(); new Thread(new process6(1)).start(); new Thread(new process6(2)).start(); new Thread(new process6(3)).start(); new Thread(new process6(4)).start(); new Thread(new process6(5)).start(); } }

java 进程同步代码_java 实现进程间的同步(源代码)相关推荐

  1. java水平线代码_java 绘制直线,跪求源代码???

    在几何中,直线是向两端无限延伸的,本实例所说的绘制直线,实际上是绘制直线上两点之间的线段,线段在实际生产和生活中经常使用.运行程序,将在窗体上绘制线段,效果如图1.1所示.图... 在几何中,直线是向 ...

  2. MFC:通过代码简单理解进程间的通讯机制——共享内存

    下面用共享映射文件的方式实现进程间通信,代码可以运行. 一.浅理解 每个进程有自己独立的空间,一个进程无法访问其他进程的数据.就好像两个是互不干涉的个体,想让它们进行通信(交换数据),就必须有一段它们 ...

  3. java 定时器代码_Java定时器代码的编写

    Java定时器代码的编写 在某些时候, 我们需要实现这样的`功能,某一程序隔一段时间执行一次,而这一事情由系统本身来完成,并不是人为的触发,我们一般可称此为定时器任务.其实到Java中,实现起来是非常 ...

  4. java 编写代码_Java 7:如何编写非常快速的Java代码

    java 编写代码 当我第一次写此博客时,我的目的是向您介绍ThreadLocalRandom类,它是Java 7中新增的用于生成随机数的类. 我在一系列微基准测试中分析了ThreadLocalRan ...

  5. java 面试代码_java代码编写及面试题

    /*//字符串逆向输出 //第一种 String string="abcdef"; for (int i = string.length()-1; i >=0; i--) { ...

  6. java游戏代码_Java与Kotlin系列文章之性能问题详解

    作者丨Jakub Anioła 译者丨姜雨生 策划丨田晓旭 随着对 Kotlin 越来越深入的了解,我发现市面上关于 Kotlin 方面,比较深入的资料几乎是 0,所以我决定,将 Kotlin 各个方 ...

  7. java四则运算代码_Java实现简单四则运算

    GitHub 项目地址 PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 10 · Estima ...

  8. java 文件下载代码_java文件下载代码实例(单文件下载和多文件打包下载)

    这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近项目有需要写文件下载相关 ...

  9. java 围棋代码_java围棋源代码

    基于 WWW 的围棋棋谱演示软件的设计 丁振凡 [期刊名称]<微型机与应用> [年(卷),期]2000(019)008 [摘要]介绍采用 Java 结合 ASP 编程实现的围棋棋谱.... ...

最新文章

  1. Spinnaker部署
  2. jenkins插件findbugs+pmd+checkstyle结合sonar与maven(java环境代码质量和代码规范管理)...
  3. 字符串的指针和指向字符串的指针变量
  4. C语言*在变量前 **p,C语言之指针*p++和*(p++)区别
  5. 「功能笔记」Spacemacs+Evil备忘录
  6. 内存管理:Linux Memory Management:MMU、段、分页、PAE、Cache、TLB
  7. oracle输出对齐方式,sql*plus 中输出格式控制技巧
  8. 常用函数(PHP/Java/MySQL)
  9. python叮当猫代码_详细介绍一个利用html+css实现叮当猫的实例代码
  10. scrum 12.8
  11. 安装RabbitMQ无法访问(http://localhost:15672)解决方案
  12. Origin: 散点图+拟合置信区间
  13. 5.ESL笔记:线性模型与高斯-马尔科夫定理
  14. 2015级计算机科学与技术2班班级博客大全
  15. 查找mysql.sock_找不到mysql.sock,我在哪里可以找到它?
  16. Mybatis复杂查询(详细举例)
  17. 二战中真实的打酱油船
  18. Centos7超详细服务器上安装配置教程
  19. Eclipse控制台中的中文输出乱码问题
  20. POI操作ppt图表完整示例演示

热门文章

  1. asp.net core 外部认证多站点模式实现
  2. 从ThoughtWorks 2017技术雷达看微软技术
  3. 网页用数学公式编辑器 可以集成到FCKeditor
  4. 【地理信息系统GIS】教案(七章全)第一章:地理信息系统概述
  5. 利用Matlab拟合时序植被生长季曲线,并求解物候参数
  6. 子窗体菜单合并到父窗体菜单的解决办法
  7. Android之让EditText不被键盘挡住
  8. C++之map插入数据相同的key不能覆盖value解决办法
  9. linux网络编程之并发服务器的三种实现模型 (超级经典)
  10. windows之DNS7种资源记录和flushdns命令清除DNS缓存以及nslookup解析域名和ipconfig/all命令查看网络配置使用总结