问题描述
启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75. 程序的输出结果应该为:

线程1: 1
线程1: 2
线程1: 3
线程1: 4
线程1: 5

线程2: 6
线程2: 7
线程2: 8
线程2: 9
线程2: 10

线程3: 71
线程3: 72
线程3: 73
线程3: 74
线程3: 75

解法一:

class PrintRunnable implements Runnable {private static volatile int printNum = 0;private int threadId;private Object o;public PrintRunnable(int threadId,Object o){this.threadId = threadId;this.o=o;}@Overridepublic void run() {while(printNum < 75){synchronized (o){if (printNum/5%3 + 1 == threadId){//该判断确保对应线程输出for (int i = 0; i <5; i++) {System.out.println("线程"+threadId+":"+(++printNum));}o.notifyAll();}else {try {o.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}
public class Main {public static void main(String[] args) throws InterruptedException {Object o = new Object();new Thread(new PrintRunnable(1,o)).start();new Thread(new PrintRunnable(2,o)).start();new Thread(new PrintRunnable(3,o)).start();}
}

解法二:

public class Print123456 implements Runnable{private String name;private Object prev;private Object self;private int count;public Print123456(String name,Object prev,Object self,int count){this.name=name;this.prev=prev;this.self=self;this.count=count;}@Overridepublic void run() {while(count<=75){synchronized (prev){synchronized (self){for (int i=0;i<5;i++){count=count+1;if(count>75)break;System.out.println(name+": "+count);}count=count+10;//System.out.println("释放自身锁,并唤醒在等待该锁的线程");self.notify();//释放自身锁,并唤醒在等待该锁的线程}//System.out.println("释放自身锁成功");try {//System.out.println("等待前一个锁");prev.wait();//等待前一个锁} catch (InterruptedException e) {e.printStackTrace();}}//System.out.println("两个锁全部释放,重新进入新的循环,但是由于有prev.wait()所以该线程等待获取prev的锁");}}
}
public class Main {public static void main(String[] args) throws InterruptedException {Object a=new Object();Object b=new Object();Object c=new Object();Print123456 A=new Print123456("线程1",c,a,0);Print123456 B=new Print123456("线程2",a,b,5);Print123456 C=new Print123456("线程3",b,c,10);new Thread(A).start();Thread.sleep(100);new Thread(B).start();Thread.sleep(100);new Thread(C).start();Thread.sleep(100);}
}

一道经典的Java多线程编程题相关推荐

  1. java 初级编程题_java基础经典编程题

    java基础经典编程题 Monkey_peach代码 package com.sailor.game; /** * 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第 ...

  2. Java 多线程编程 实验题

    Java 多线程编程 实验二 1.创建键盘操作练习 2. 双线程猜数字 3. 月亮围绕地球 1.创建键盘操作练习 题目描述: 编写一个Java应用程序,在主线程中再创建两个线程, 一个线程负责给出键盘 ...

  3. 《Java多线程编程核心技术》读书笔记

    为什么80%的码农都做不了架构师?>>>    <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...

  4. Java多线程编程(四)——死锁问题

    死锁 什么是死锁? 什么情况下会产生死锁? 生产者与消费者 什么是生产者与消费者? Object类的等待和唤醒方法 生产者-消费者案例(唤醒机制) 基本写法 代码书写技巧与"套路" ...

  5. java多线程编程从入门到卓越(超详细总结)

    导读:java多线程编程不太熟?或是听说过?或是想复习一下?找不到好的文章?别担心我给你们又安利一波,文章内容很全,并且考虑到很多开发中遇到的问题和解决方案.循环渐进,通俗易懂,文章较长,建议收藏再看 ...

  6. Java 多线程编程核心技术

    课程介绍 多线程编程在最大限度利用计算资源.提高软件服务质量方面扮演着至关重要的角色,而掌握多线程编程也成为了广大开发人员所必须要具备的技能. 本课程以基本概念.原理方法为主线,每篇文章结合大量演示实 ...

  7. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  8. java多线程编程同步方法_实践【Java多线程编程核心技术】系列:同步方法造成的无限等待...

    本文实践来自于[Java多线程编程核心技术]一书! 同步方法容易造成死循环,如-- 类Service.java: package service; public class Service { syn ...

  9. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

最新文章

  1. C++知识点22——使用C++标准库(顺序容器list的初始化、赋值、访问、交换、添加、删除与迭代器失效)
  2. 8.2.1.3 Range 优化
  3. C++ 下使用curl 获取ftp文件
  4. ASP.NET 2.0 解决了 Code-Behind 需要控件声明同步的问题
  5. c语言设计 数组的知识点,C语言程序设计知识点及示例.pdf
  6. ibatis的简介与初步搭建应用
  7. Shell脚本——变量
  8. html浮动代码_(10)让“盒子”动起来:① 浮动 | CSS
  9. 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
  10. php pdo setfetchmode,PDOStatement::setFetchMode
  11. mysql 系统工程师_数据库系统工程师难考吗?
  12. 使用H-lua框架制作魔兽争霸地图(3-物编-物品篇1)
  13. 深圳计算机职称叫什么,深圳职称是什么
  14. 暴走欧洲之在德国的反思
  15. 图说全球浏览器市场份额变迁史
  16. 怎样用python计算π的值_IV.python初探日记:python实现蒙特卡洛方法计算π值
  17. ImportError: cannot import name ‘evaluate‘ from ‘surprise‘解决方案
  18. js(javascript)页面刷新
  19. 利用网络编程实现TFTP协议
  20. CRC查表法——表的由来及Java实现CRC8校验算法

热门文章

  1. ios::sync_with_stdio(false)
  2. M家的蜘蛛不可能那么可爱 [破解红蜘蛛多媒体教室]
  3. 微信开放平台unionID 的利用(app推广转化率的解决方案)
  4. 七十七、Kettle的简介与安装部署
  5. ArcGIS 要素转面 消除重叠
  6. vue 计数器_Vuex 使用及简单实例(计数器)
  7. 手机无法连接电脑的手机助手
  8. 管家婆服务器端口修改,更改sql数据库端口
  9. 《数据库应用系统实践》------ 酒店客房管理系统
  10. 树莓派点灯笔记(论如何学好控制IO输出)