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

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

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

代码:

方法一:直接写

package Homework;

public class Test2 {
public static void main(String[] args) {
O o=new O();
Threadnum threadnum=new Threadnum(o);
Threadabc threadabc=new Threadabc(o);
Thread thread=new Thread(threadnum);
Thread thread2=new Thread(threadabc);
thread.start();
thread2.start();
}
} //资源类线程O
class O{
public synchronized void num(){
/*for(int i=1;i<=52;i++){
System.out.print(i);
if (i % 2 == 0) {
this.notify();
try {
this.wait();
} catch (InterruptedException e) {
// TODO 待完善
e.printStackTrace();
}
}*/
for(int i=0;i<26;i++){
this.notify();
for(int j=1+2*i;j<2*i+3;j++){
System.out.print(j);
}
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
public synchronized void abc(){
for(int i=65;i<91;i++){
this.notify();
System.out.print((char)(i));
//终止程序,执行完最后一次,不需要在等待了
if(i<90){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} //打印数字线程
class Threadnum implements Runnable{
O o;
public Threadnum(O o){
this.o=o;
}
@Override
public void run() {
o.num();
}
} //打印字母线程
class Threadabc implements Runnable{
O o;
public Threadabc(O o){
this.o=o;
}
@Override
public void run() {
try {
Thread.sleep(20);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
o.abc();
}
}

运行结果:

方法二:采用标志位

资源类:

package com.qf.demo2;
// 12A34B56C
/**
* 线程间通信 需要放在线程同步中
* 1 资源类中方法 是同步的
* 2 boolean标志 标志状态
* 3 方法里面 先判断状态(是否需要等待)
* 4 如果不需要等待 执行 打印 加减操作
* 5 执行完操作以后需要切换状态
* 6 唤醒对象线程
*
*/
public class Resource { boolean flag = true; // true 打印了字母还没有打印数字 字母等着 数字打印
// false 打印了数字了 还没有打印字母 数字等着 字母打印 // 先打印两个数字
public synchronized void printNum(int num){
if(flag==false){// 打印了数字 还没打印字母
try {
this.wait();// 数字等着
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// true 打印了字母 还没打印数字 打印数字
System.out.print(num+""+(num+1));// 1 12 34
//已经打印完了数字了 切换状态
flag = false;
//唤醒字母线程
this.notify(); }
// 在打印一个字母
public synchronized void printLetter(int letter){
if(flag == true){//打印了字母还没有打印数字
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// false 打印了数字还没打印字母 打印字母
System.out.print((char)(letter+65));
// 打印完了字母了 ,需要切换状态
//切换成 打印完了字母,还没打印数字 true
flag = true;
// 唤醒对方线程
this.notify();
}
}

测试类:

package com.qf.demo2;

public class Test {

    public static void main(String[] args) {
Resource resource = new Resource(); Number number = new Number(resource);
Letter letter = new Letter(resource); Thread thread = new Thread(number);
Thread thread2 = new Thread(letter); thread.start();
thread2.start();
}
} class Number implements Runnable{
Resource resource ;
public Number(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 1; i < 52; i+=2) {
// 1 3 5 7 9
resource.printNum(i);
} }
} class Letter implements Runnable{
Resource resource ;
public Letter(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 26; i++) {
resource.printLetter(i);
} }
}

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. angular双向数据绑定

    <body ng-app> //三个view都会变 <input type="text" ng-model="name" value=&quo ...

  2. C#处理JSON 数据

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...

  3. 原生ajax实现http请求

      1⃣️先简单了解一下HTTP协议: http是计算机通过网络进行通信的一种规则,它是一种无状态协议(不建立持久链接,直白点儿说就是请求响应完事儿之后,链接就断开)  2⃣️一个完整的http请求有 ...

  4. [ext4]空间管理 - 查找块

     在文件系统中,当需要执行写操作时,肯定是需要查找需要写入的块.那么如何查找块哪? 在Ext4系统中,有两个函数是可能执行查找操作的:ext4_getblk().ext4_get_block(). ...

  5. 需求收集实例三之 FM

    暂且叫这个项目叫FM.FM项目采用敏捷模式,需求的表现形式是Story. 此项目需求收集过程如下: 亮点:在公司第一次实践敏捷.用Story 而非 需求说明文档呈现需求. 败笔:没有处理好Story ...

  6. js中面向对象编程

    一.理解对象: 第一种:基于Object对象 var person = new Object(); person.name = 'My Name'; person.age = 18; person.g ...

  7. get和post方式请求数据,jsonp

    get方式请求数据: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #289c97 } p.p2 { ma ...

  8. MySQL ProxySQL读写分离使用初探

    目的 在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异.具体的介绍可以看官网的相关说明,并且这个中间件也是percon ...

  9. Java学习笔记——排序算法之快速排序

    会当凌绝顶,一览众山小. --望岳 如果说有哪个排序算法不能不会,那就是快速排序(Quick Sort)了 快速排序简单而高效,是最适合学习的进阶排序算法. 直接上代码: public class Q ...

  10. Linux 下安装RabbitMQ 3.6.1

    1.安装erlang 依赖 yum install -y gcc gcc-c++ unixODBC-devel openssl-devel ncurses-devel 2.安装erlang ### 设 ...