* 写两个线程,一个线程打印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. 关于mpu6050的几个很好的帖子

    最近在研究6050,真是很磨人啊,这个小东西还挺复杂,一个读取程序竟然需要600多行. 这几天连查资料找到了几个很好的帖子,要是以后有人看到这篇帖子,可以避免误入歧途,也可以省去很多时间. 1.阿西莫 ...

  2. vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。

    最近新装了2017,开始前几天还好, 可是最近在添加引用时,报错 ---------------------------Microsoft Visual Studio----------------- ...

  3. Filter和Listener的应用——分IP统计网站访问次数

    一:分析 统计工作需要在所有资源执行前进行,所以需要放在filter中 这个拦截器仅仅进行统计工作,不进行拦截,所以请求必须继续传递下去 用Map<String,integer>来保存数据 ...

  4. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

  5. 针对Mac的DuckHunter攻击演示

    0x00 HID 攻击 HID是Human Interface Device的缩写,也就是人机交互设备,说通俗一点,HID设备一般指的是键盘.鼠标等等这一类用于为计算机提供数据输入的设备. DuckH ...

  6. 蓝桥杯-核桃的数量-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  7. centos下安装dubbo-admin步骤

    前言: 纠正网上一些错误的博文,真的害人不浅,按照他们的说法,dubbo-admin在jdk1.8的版本下无法启动注册中心,需要去github下载阿里提供的源码,然后install进本地仓库并打包成w ...

  8. OC中@class的使用

    作用: 可以简单地引用一个类简单使用@class Dog; //类的引入 #import "Dog.h"仅仅是告诉编译器:Dog是一个类;并不会包含Dog这个类的所有内容 具体使用 ...

  9. 利刃 MVVMLight 9:Messenger

    MVVM的目标之一就是为了解耦View和ViewModel.View负责视图展示,ViewModel负责业务逻辑处理,尽量保证 View.xaml.cs中的简洁,不包含复杂的业务逻辑代码. 但是在实际 ...

  10. JavaScript知识点整理 (二)

    1)函数概述 1.函数是一块 JS 代码,被定义一次,但可以执行和调用多次. JS 中的函数也是对象,所以 JS 函数可以像其它对象那样操作和传递,所以也常叫 JS 中的函数为函数对象. 2.函数也是 ...