* 写两个线程,一个线程打印1-52,另一个线程答应字母A-Z。

* 打印顺序为12A34B56C……5152Z。通过使用线程之间的通信协调关系。

  • 注:分别给两个对象构造一个对象o,数字每打印两个或字母每打印一个就执行o.wait()。
  • 在o.wait()之前不要忘了写o.notify()

代码:

方法一:直接写

  1. package Homework;
  2. public class Test2 {
  3. public static void main(String[] args) {
  4. O o=new O();
  5. Threadnum threadnum=new Threadnum(o);
  6. Threadabc threadabc=new Threadabc(o);
  7. Thread thread=new Thread(threadnum);
  8. Thread thread2=new Thread(threadabc);
  9. thread.start();
  10. thread2.start();
  11. }
  12. }
  13. //资源类线程O
  14. class O{
  15. public synchronized void num(){
  16. /*for(int i=1;i<=52;i++){
  17. System.out.print(i);
  18. if (i % 2 == 0) {
  19. this.notify();
  20. try {
  21. this.wait();
  22. } catch (InterruptedException e) {
  23. // TODO 待完善
  24. e.printStackTrace();
  25. }
  26. }*/
  27. for(int i=0;i<26;i++){
  28. this.notify();
  29. for(int j=1+2*i;j<2*i+3;j++){
  30. System.out.print(j);
  31. }
  32. try {
  33. this.wait();
  34. } catch (InterruptedException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. public synchronized void abc(){
  41. for(int i=65;i<91;i++){
  42. this.notify();
  43. System.out.print((char)(i));
  44. //终止程序,执行完最后一次,不需要在等待了
  45. if(i<90){
  46. try {
  47. this.wait();
  48. } catch (InterruptedException e) {
  49. // TODO Auto-generated catch block
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. }
  55. }
  56. //打印数字线程
  57. class Threadnum implements Runnable{
  58. O o;
  59. public Threadnum(O o){
  60. this.o=o;
  61. }
  62. @Override
  63. public void run() {
  64. o.num();
  65. }
  66. }
  67. //打印字母线程
  68. class Threadabc implements Runnable{
  69. O o;
  70. public Threadabc(O o){
  71. this.o=o;
  72. }
  73. @Override
  74. public void run() {
  75. try {
  76. Thread.sleep(20);
  77. } catch (InterruptedException e1) {
  78. // TODO Auto-generated catch block
  79. e1.printStackTrace();
  80. }
  81. o.abc();
  82. }
  83. }

运行结果:

方法二:采用标志位

资源类:

  1. package com.qf.demo2;
  2. // 12A34B56C
  3. /**
  4. * 线程间通信 需要放在线程同步中
  5. * 1 资源类中方法 是同步的
  6. * 2 boolean标志 标志状态
  7. * 3 方法里面 先判断状态(是否需要等待)
  8. * 4 如果不需要等待 执行 打印 加减操作
  9. * 5 执行完操作以后需要切换状态
  10. * 6 唤醒对象线程
  11. *
  12. */
  13. public class Resource {
  14. boolean flag = true; // true 打印了字母还没有打印数字 字母等着 数字打印
  15. // false 打印了数字了 还没有打印字母 数字等着 字母打印
  16. // 先打印两个数字
  17. public synchronized void printNum(int num){
  18. if(flag==false){// 打印了数字 还没打印字母
  19. try {
  20. this.wait();// 数字等着
  21. } catch (InterruptedException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. }
  26. // true 打印了字母 还没打印数字 打印数字
  27. System.out.print(num+""+(num+1));// 1 12 34
  28. //已经打印完了数字了 切换状态
  29. flag = false;
  30. //唤醒字母线程
  31. this.notify();
  32. }
  33. // 在打印一个字母
  34. public synchronized void printLetter(int letter){
  35. if(flag == true){//打印了字母还没有打印数字
  36. try {
  37. this.wait();
  38. } catch (InterruptedException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42. }
  43. // false 打印了数字还没打印字母 打印字母
  44. System.out.print((char)(letter+65));
  45. // 打印完了字母了 ,需要切换状态
  46. //切换成 打印完了字母,还没打印数字 true
  47. flag = true;
  48. // 唤醒对方线程
  49. this.notify();
  50. }
  51. }

测试类:

  1. package com.qf.demo2;
  2. public class Test {
  3. public static void main(String[] args) {
  4. Resource resource = new Resource();
  5. Number number = new Number(resource);
  6. Letter letter = new Letter(resource);
  7. Thread thread = new Thread(number);
  8. Thread thread2 = new Thread(letter);
  9. thread.start();
  10. thread2.start();
  11. }
  12. }
  13. class Number implements Runnable{
  14. Resource resource ;
  15. public Number(Resource resource) {
  16. this.resource = resource;
  17. }
  18. @Override
  19. public void run() {
  20. for (int i = 1; i < 52; i+=2) {
  21. // 1 3 5 7 9
  22. resource.printNum(i);
  23. }
  24. }
  25. }
  26. class Letter implements Runnable{
  27. Resource resource ;
  28. public Letter(Resource resource) {
  29. this.resource = resource;
  30. }
  31. @Override
  32. public void run() {
  33. for (int i = 0; i < 26; i++) {
  34. resource.printLetter(i);
  35. }
  36. }
  37. }

Java之【线程通信】--标志位练习的更多相关文章

  1. java多线程-线程通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...

  2. Java之线程通信的方法

    /** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...

  3. java socket线程通信

    关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...

  4. java多线程——线程通信

    一.线程通信目标 1.线程通信的目标是使线程间能够互相发送信号 2.线程通信使线程能够等待其他线程的信号 二.几种方式 1.通过共享对象 2.忙等待 线程 B 运行在一个循环里,以等待信号 (不释放c ...

  5. Java之线程通信的应用:经典例题:生产者/消费者问题

    /** * 线程通信的应用:经典例题:生产者/消费者问题 * * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品, * 店员一次只能持有固定数量 ...

  6. [ Python - 12 ] 线程的信号量、标志位及队列

    线程的信号量 线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发. #!_*_coding:utf-8_*_ # Author: hkey import threading, t ...

  7. 浅谈java中线程和操作系统线程

    在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就 ...

  8. 进程保护--CrossThreadFlags标志位

    原理: 1. 将进程的所有线程的线程CrossThreadFlags标志位设置成Terminated或者System. 效果:任务管理器,WSYSCheck,ICESWORD无法结束进程.. 但PCH ...

  9. Java多线程-线程中止

    不正确的线程中止-Stop Stop:中止线程,并且清除监控器锁的信息,但是可能导致 线程安全问题,JDK不建议用. Destroy: JDK未实现该方法. /** * @author simon * ...

随机推荐

  1. 利用 force recovery 解决服务器 crash 导致 MySQL 重启失败的问题

    小明同学在本机上安装了 MySQL 5.7.17 配合项目进行开发,并且已经有了一部分重要数据.某天小明在开发的时候,需要出去一趟就直接把电脑关掉了,没有让 MySQL 正常关闭,重启 MySQL 的 ...

  2. 基于bootstrap的bootstrap-editable插件实现即时编辑功能

    1.引用基本css和js: <link href="bootstrap3/css/bootstrap.min.css" rel="stylesheet" ...

  3. Unity 检测物体是否在相机视野范围内

    需求: 类似NPC血条,当NPC处于摄像机视野内,血条绘制,且一直保持在NPC头顶. 开始: 网上查找资料,然后编写代码: public RectTransform rectBloodPos; voi ...

  4. Oracle修改监听端口号1521[转]

    在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,在这里,教大家如何修改oracle默认端口号为9999: 1.查 ...

  5. [进程管理]Load和CPU利用率是如何算出来的

    本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://www.penglixun.com/tech/system/how_to_ca ...

  6. 基于Activiti的流程应用开发平台JSAAS-WF V5.3

    第1章 产品概述及体系架构 1.1.概述 红迅JSAAS-WF工作流平台V5是广州红迅软件有限公司面向合作伙伴以及有IT运维团队中大型企业提供新一代的流程管理产品,它基于流行的JAVA开源技术上构建, ...

  7. 对象克隆(clone)实例详解

    <?php class Staff { public $name; public $age; public $salary; public function __construct($name, ...

  8. Linux 定时任务详解

    原文地址:http://edu.codepub.com/2011/0104/28518.php   crond分为系统级定时和用户级定时,系统级定时主要编辑/etc/crontab,用户级定时主要利用 ...

  9. C# Webclient 和 Httpclient如何通过iis authentication 身份验证。

    前言: 该博客产生的背景是客户那边有部署网站的方法是iis windows authentication身份验证,而系统中使用Webclient来调用别的系统的方法.在此情况下,原本可以使用的功能,都 ...

  10. CSS3特效----制作立体导航栏菜单

    使用CSS3实现下图的导航菜单效果 <!doctype html> <html lang="en"> <head> <meta chars ...