/****************************************************************
* 迅雷笔试题:
* 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…
*
* @author: heartraid
*****************************************************************/
代码1:
/**
* 锁码:公共数据区
* 码值:码值为A,表示应该由A线程来执行,B,C线程等待
* 码值为B,C同理。
*/
class LockCode{
/**当前锁码码值,初始码值为A,表示最初由A线程运行*/
private char code='A';
/**单例模式*/
private LockCode(){
}
public static LockCode newInstance(){
return new LockCode();
}
/**
* 循环设置锁码
* 每一次调用,锁码按照A-B-C-A-...-的顺序循环往复
*/
public void setCode(){
this.code=(char)(this.code+1);
if(this.code=='D')
this.code='A';
}
/**
* 得到锁码
*/
public char getCode(){
return this.code;
}
}
/**
* 完成打印工作的线程类
*/
class PrintRunnable implements Runnable{
/**需要打印的字符*/
private char character='?';
/**公共锁码*/
private LockCode lockCode=null;
PrintRunnable(char c,LockCode l){
this.character=c;
this.lockCode=l;
}
/**
* 线程执行
*/
public void run() {
int loopCount=1;
while(loopCount<=10){
synchronized(lockCode){//线程同步操作锁码
try{
//如果当前运行的线程并不等于当前锁码的码值,则改线程等待
//比如当前运行线程是A,但是码值为B,则A线程等待。
while(lockCode.getCode()!=this.character)
lockCode.wait();
//码值匹配成功,打印字符
System.out.print(this.character);
//循环10次记数
loopCount++;
//设置码值,让下一个线程可以运行
lockCode.setCode();
//让其他所有等待线程激活
lockCode.notifyAll();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
/**
* 测试
*/
public class ThreadLoopPrint {
public static void main(String[] args) {
LockCode lockCode=LockCode.newInstance();//公共锁码
Thread ta=new Thread(new PrintRunnable('A',lockCode));
Thread tb=new Thread(new PrintRunnable('B',lockCode));
Thread tc=new Thread(new PrintRunnable('C',lockCode));
ta.start();
tb.start();
tc.start();
}
}
代码2:
/**
*此代码和上面的代码有一个很大的相同点,就是都利用公共数据区中的数据变化来决定线程工作还是阻塞等待。公共数据区利用了类静态变量。因此代码简洁。
*
*@author jiangtao
*@date 2010-2-27
*@version 1.0
*/
public class MyThread extends Thread{
public static String[] NAMES = new String[] { "A", "B", "C" };
public static int POS = 0;
private static final long DURATION = 1000;
private int count = 10;
public MyThread (String name) {
this.setName(name);
}
@Override
public void run() {
while (count > 0) {
if (this.getName().equals(NAMES[POS])) {
this.print();
this.count--;
}
try {
Thread.sleep(DURATION);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void print() {
System.out.print(this.getName());
POS = (POS >= NAMES.length - 1 ? 0 : ++POS);
}
public static void main(String[] args) {
new MyThread ("A").start();
new MyThread ("B").start();
new MyThread ("C").start();
}
}
分享到:
相关推荐
1.使用三种VC的多线程同步方法编写一个多线程的程序(要求在屏幕上先显示Hello,再显示World)。 1)基于全局变量的多线程同步程序; 2)基于事件的多线程同步程序; 3)基于临界区的多线程同步程序。
MFC 多线程及线程同步 MFC 多线程及线程同步 MFC 多线程及线程同步
多线程依次循环打印26个英文字母
Qt案例之利用QThread类实现简单多线程案例循环打印数字,可参考文章:https://blog.csdn.net/didi_ya/article/details/122661092
多线程中使用循环队列
很不错的源码,3种多线程实现同步方法
Java多线程同步.pdf
满足这两个条件,就可以不用进行线程同步啦! 如何保证读在写之后呢,方法有多种,比如 读线程判断条件if(读指针 == 写指针)。写线程判断条件 if(下一个指针==读线程指针) 其实这就是一简单的生产者与消费者问题。 ...
MFC多线程同步类的使用
.NET多线程同步方法详解(一):自由锁(InterLocked) 本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,...
本实验通过设计两个线程,一个是文章下载线程和一个文章打印线程,用来实现模拟线程同步打印机,文章下载线程实现把文章下载到缓冲区,文章打印线程实现把文章打印出来。
多线程的同步机制 多线程的同步机制 多线程的同步机制
多线程同步解决卖票问题
很不错的Delphi多线程和线程同步的例子,完整源码 原来的一个不知道CSDN怎么把文件搞丢了!新传一个资源,包含一个线程排序的例子!代码均搜集自网上!
多线程的应用 主要是描述事件对象的创建和线程的同步
d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more ...
包含了多线程基本内容的讲解以及代码实现,多线程同步的四种方法(临界区、互斥、事件、信号量)的实现。
简单实现多线程同步示例(模拟购票系统),内容为实现多线程同步过程,模拟购票系统进行同步购买情况;该处并未考虑线程守护问题,后期将对线程锁等安全问题进行初步研究!
多线程同步和通讯完整示例,包括synchronized、wait-nofity机制、lock锁
C#的多线程同步,C#中四种进程或线程同步互斥的控制方法