Java之【线程通信】--标志位练习
* 写两个线程,一个线程打印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之【线程通信】--标志位练习的更多相关文章
- java多线程-线程通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...
- Java之线程通信的方法
/** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...
- java socket线程通信
关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...
- java多线程——线程通信
一.线程通信目标 1.线程通信的目标是使线程间能够互相发送信号 2.线程通信使线程能够等待其他线程的信号 二.几种方式 1.通过共享对象 2.忙等待 线程 B 运行在一个循环里,以等待信号 (不释放c ...
- Java之线程通信的应用:经典例题:生产者/消费者问题
/** * 线程通信的应用:经典例题:生产者/消费者问题 * * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品, * 店员一次只能持有固定数量 ...
- [ Python - 12 ] 线程的信号量、标志位及队列
线程的信号量 线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发. #!_*_coding:utf-8_*_ # Author: hkey import threading, t ...
- 浅谈java中线程和操作系统线程
在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就 ...
- 进程保护--CrossThreadFlags标志位
原理: 1. 将进程的所有线程的线程CrossThreadFlags标志位设置成Terminated或者System. 效果:任务管理器,WSYSCheck,ICESWORD无法结束进程.. 但PCH ...
- Java多线程-线程中止
不正确的线程中止-Stop Stop:中止线程,并且清除监控器锁的信息,但是可能导致 线程安全问题,JDK不建议用. Destroy: JDK未实现该方法. /** * @author simon * ...
随机推荐
- linux 程序调用system执行命令
正确使用system方法,判断返回值 int exeCmd(const char *cmd) { pid_t status; status = system(cmd); == status) { Wr ...
- java设计模式--基础思想总结--父类引用操作对象
看设计模式的相关书籍也有一段时间了,一开始其实是抱着作为java三大框架的基础知识储备来学习的,不过到后来,才发现,在设计模式的一些准则装饰下,java的面向对象威力才真正地体现出来,后面的将会陆续地 ...
- Android的root学习
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿.在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示输入root ...
- WebStorm设置左侧菜单栏背景和字体设置
WebStorm左侧菜单栏 webstorm是一款前端IDE利器,个人感觉黑色的背景比较炫酷,刚开始从网上下载的主题只能修改编辑窗口的背景色,经过查询资料终于把左边菜单栏的背景色也修改了. 第一步:点 ...
- 【DP系列学习一】简单题:kickstart2017 B.vote
https://code.google.com/codejam/contest/6304486/dashboard#s=p1 这是一道简单的dp,dp[i][j]代表A的voter为i,B的voter ...
- php代码效率小常识
1, 尽量不要使用@来进行抑制错误,效率很低 2,能使用单引号时不要使用双引号 3,echo的效率比print要高,同时echo可以输出多个变量 4,使用include,require时候最好使用绝对 ...
- Python基本语法--语句
# -*- coding: utf-8 -*- #条件语句 ''' if 判断条件: 执行语句…… else: 执行语句…… ''' flag = False name = 'python' if n ...
- JavaScript常用的方法和函数(setInterval和setTimeout)
1.setInterval:计时器 可以按照指定的周期(以毫秒为单位)来调用函数或计算表达式 调用格式:setinterval(fun,time) 说明:fun为函数体,time为数值,这两个参数是必 ...
- VueJs开发笔记—IDE选择和WebStorm性能优化、框架特性和数据调用、路由选项以及使用
一.IDE的选择: VsCode和WebStorm都是不错的选择,两者运行调试都非常的方便都可以使用快捷键运行和停止,就打开项目的速度和对电脑配置的要求来说,vscode要比webstorm要出色很多 ...
- CATransition 转场动画解析
http://blog.csdn.net/mad2man/article/details/17260901