* 写两个线程,一个线程打印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. linux 程序调用system执行命令

    正确使用system方法,判断返回值 int exeCmd(const char *cmd) { pid_t status; status = system(cmd); == status) { Wr ...

  2. java设计模式--基础思想总结--父类引用操作对象

    看设计模式的相关书籍也有一段时间了,一开始其实是抱着作为java三大框架的基础知识储备来学习的,不过到后来,才发现,在设计模式的一些准则装饰下,java的面向对象威力才真正地体现出来,后面的将会陆续地 ...

  3. Android的root学习

    Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿.在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示输入root ...

  4. WebStorm设置左侧菜单栏背景和字体设置

    WebStorm左侧菜单栏 webstorm是一款前端IDE利器,个人感觉黑色的背景比较炫酷,刚开始从网上下载的主题只能修改编辑窗口的背景色,经过查询资料终于把左边菜单栏的背景色也修改了. 第一步:点 ...

  5. 【DP系列学习一】简单题:kickstart2017 B.vote

    https://code.google.com/codejam/contest/6304486/dashboard#s=p1 这是一道简单的dp,dp[i][j]代表A的voter为i,B的voter ...

  6. php代码效率小常识

    1, 尽量不要使用@来进行抑制错误,效率很低 2,能使用单引号时不要使用双引号 3,echo的效率比print要高,同时echo可以输出多个变量 4,使用include,require时候最好使用绝对 ...

  7. Python基本语法--语句

    # -*- coding: utf-8 -*- #条件语句 ''' if 判断条件: 执行语句…… else: 执行语句…… ''' flag = False name = 'python' if n ...

  8. JavaScript常用的方法和函数(setInterval和setTimeout)

    1.setInterval:计时器 可以按照指定的周期(以毫秒为单位)来调用函数或计算表达式 调用格式:setinterval(fun,time) 说明:fun为函数体,time为数值,这两个参数是必 ...

  9. VueJs开发笔记—IDE选择和WebStorm性能优化、框架特性和数据调用、路由选项以及使用

    一.IDE的选择: VsCode和WebStorm都是不错的选择,两者运行调试都非常的方便都可以使用快捷键运行和停止,就打开项目的速度和对电脑配置的要求来说,vscode要比webstorm要出色很多 ...

  10. CATransition 转场动画解析

    http://blog.csdn.net/mad2man/article/details/17260901