我写的

  1. class LN
  2. {
  3. private int flag = 0;
  4. public static char ch = 'A';
  5. public static int n = 1;
  6. public synchronized void printLetter()
  7. {
  8. try
  9. {
  10. if(flag == 0 || flag == 1)
  11. {
  12. wait();
  13. }
  14. else
  15. {
  16. //System.out.println("flag = " + flag);
  17. System.out.print(ch);
  18. ch++;
  19.  
  20. flag = (flag + 1) % 3;
  21.  
  22. notifyAll();
  23. }
  24. }
  25. catch(InterruptedException ex)
  26. {
  27. ex.printStackTrace();
  28. }
  29. }
  30. public synchronized void printNumber()
  31. {
  32. try
  33. {
  34. if(flag == 2 )
  35. {
  36. wait();
  37. }
  38. else
  39. {
  40. //System.out.println("flag = " + flag);
  41. System.out.print(n);
  42. n++;
  43.  
  44. flag = (flag + 1) % 3;
  45.  
  46. notifyAll();
  47. }
  48. }
  49. catch(InterruptedException ex)
  50. {
  51. ex.printStackTrace();
  52. }
  53. }
  54. }
  55.  
  56. class Letter extends Thread
  57. {
  58. LN ln;
  59. Letter(LN ln)
  60. {
  61. this.ln = ln;
  62. }
  63. public void run()
  64. {
  65. for(int i = 0 ; i< 26; i++)
  66. {
  67. ln.printLetter();
  68. }
  69. }
  70. }
  71. class Number extends Thread
  72. {
  73. LN ln;
  74. Number(LN ln)
  75. {
  76. this.ln = ln;
  77. }
  78. public void run()
  79. {
  80. for(int i = 0 ; i< 78; i++)
  81. {
  82. ln.printNumber();
  83. }
  84. }
  85. }
  86.  
  87. class Practice1
  88. {
  89. public static void main(String[] args) {
  90.  
  91. LN ln = new LN();
  92. new Letter(ln).start();
  93. new Number(ln).start();
  94. }
  95. }

网上找的

  1. public class ThreadDemo {
  2. // 测试
  3. public static void main(String[] args) {
  4. Object obj = new Object();
  5. // 启动两个线程
  6. Thread1 t1 = new Thread1(obj);
  7. Thread2 t2 = new Thread2(obj);
  8.  
  9. t1.start();
  10. t2.start();
  11. }
  12. }
  13.  
  14. class Thread1 extends Thread {
  15. private Object obj;
  16.  
  17. public Thread1(Object obj) {
  18. this.obj = obj;
  19. }
  20.  
  21. public void run() {
  22. // 加锁
  23. synchronized (obj) {
  24. // 打印1-52
  25. for (int i = 1; i < 53; i++) {
  26. System.out.print(i);
  27. if (i % 2 == 0) {
  28. // 不能忘了唤醒其它线程
  29. obj.notifyAll();
  30. try {
  31. obj.wait();
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  37.  
  38. }
  39. }
  40. }
  41.  
  42. class Thread2 extends Thread {
  43. private Object obj;
  44.  
  45. public Thread2(Object obj) {
  46. this.obj = obj;
  47. }
  48.  
  49. public void run() {
  50. synchronized (obj) {
  51. // 打印A-Z
  52. for (int i = 0; i < 26; i++) {
  53. System.out.print((char) ('A' + i));
  54. // 不能忘了唤醒其它线程
  55. obj.notifyAll();
  56. try {
  57. obj.wait();
  58. } catch (InterruptedException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. }
  64. }

写2个线程,其中一个线程打印1~52,另一个线程打印A~z,打印顺序应该是12A34B45C……5152Z的更多相关文章

  1. 写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z

    题目: 写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z.要求用线程间的通信. /** * 写两个线程,第一个线程打印1-52,第二个线程打印 ...

  2. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  3. Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程

    下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...

  4. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  5. WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变

    本文说明WPF [调用线程无法访问此对象,因为另一个线程拥有该对象.] 解决方案以及如何实现字体颜色的渐变 先来看看C#中Timer的简单说明,你想必猜到实现需要用到Timer的相关知识了吧. C# ...

  6. 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?

    一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...

  7. JVM源码分析之一个Java进程究竟能创建多少线程

    JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...

  8. Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

    转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...

  9. 10.4 android输入系统_框架、编写一个万能模拟输入驱动程序、reader/dispatcher线程启动过程源码分析

    1. 输入系统框架 android输入系统官方文档 // 需FQhttp://source.android.com/devices/input/index.html <深入理解Android 卷 ...

随机推荐

  1. 文本搜索grep知识点总结

    文本搜索工具:grep, egrep     根据用户指定的模式对目标文件进行过滤,显示被模式匹配到的行     grep [OPTION]... 'PATTERN' FILE...          ...

  2. 【01】CSS规范

    [01]CSS规范 []https://drafts.csswg.org/indexes/(下图)   https://www.w3.org/TR/2011/REC-CSS2-20110607/   ...

  3. Chrome 开发者工具(DevTools)中所有快捷方式列表(已整理)

    Chrome 开发者工具(DevTools)中所有快捷方式列表(已整理) 前言 Chrome DevTools提供了一些内置的快捷键,开发者利用这些快捷键可以节省常工作中很多日的开发时间.下面列出了每 ...

  4. 学习笔记1——下载和安装WordPress

    首先,到WordPress官方网站下载WordPress,下载地址https://cn.wordpress.org/txt-download/ 然后,将下载后的文件夹放在www目录下,到浏览器中输入l ...

  5. php在字符串中替换多个字符

    php替换多个字符串str_replace函数 echo str_replace(array("m","i"),array("n",&quo ...

  6. SQL 优化案例之变更表结构

    从慢日志报表中看到一条很长的SQL select id from myinfo and (( SUBSTRING_INDEX(location_axis, ) ) ) ), '$%') ) or ( ...

  7. 【Luogu】P1383高级打字机

    可持久化线段树模板题之一. 权当温习主席树模板 #include<cstdio> #include<cstdlib> #include<cctype> #defin ...

  8. vue 组件高级用法实例详解

    一.递归组件 组件在它的模板内可以递归地调用自己, 只要给组件设置name 的选项就可以了. 示例如下: <div id="app19"> <my-compone ...

  9. mybatis学习(一)——mybatis简介

    1.简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBati ...

  10. SHOWMODALDIALOG表单提交时禁止打开新窗口

    前提条件:showmodaldialog中有表单form.当action="#"的时候,提交表单,不会打开新窗口,但这种#自提有时不能用,#是本页面完整的带参数的url,如果表单中 ...