`

【迅雷】多线程同步循环打印

阅读更多

/****************************************************************
 * 迅雷笔试题:
 * 有三个线程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();
    }
}
分享到:
评论
3 楼 sky88088 2014-11-10  
这个不是单例模式吧……还是可以生成多个实例啊
2 楼 夏广元 2014-03-11  
xiao_2008 写道
private synchronized void print() { 
        System.out.print(this.getName()); 
        POS = (POS >= NAMES.length - 1 ? 0 : ++POS); 
    } 

去掉synchronized也可以


去掉不行吧。去掉的话,可能三个线程都会抢占资源执行print方法,这样就不能保证abc的顺序了吧?
1 楼 xiao_2008 2012-08-28  
private synchronized void print() { 
        System.out.print(this.getName()); 
        POS = (POS >= NAMES.length - 1 ? 0 : ++POS); 
    } 

去掉synchronized也可以

相关推荐

    传智播客_Java培训_毕向东_Java基础[05-多线程]

    ### 传智播客_Java培训_毕向东_Java基础[05-多线程] #### 1. 进程与线程的概念 在计算机科学领域中,**进程**是程序的一次动态执行过程,而**线程**则是进程内的一个执行单元。简单来说,一个程序启动后就是一个...

    2018年蚂蚁课堂(每特教育)-Java工程师面试宝典-V1.0

    - 迅雷多线程下载:将一个大文件分成多个小块,每个小块由一个线程负责下载,大大提升了下载速度。 - **多线程安全问题及其解决方案** - 当多个线程访问同一共享资源时,如果没有适当的同步措施,可能会出现数据...

    C++迅雷笔试全集,推荐

    7. **多线程编程**:随着多核处理器的普及,掌握多线程编程技术,如线程同步、互斥锁、条件变量等,成为高级C++程序员的必备技能。 8. **网络编程**:对于迅雷这样的互联网公司而言,理解TCP/IP协议、socket编程,...

    迅雷Java和C++面试题

    多线程 - **线程创建**:理解Thread类和Runnable接口的使用方法。 - **同步与死锁**:掌握synchronized关键字的用法,了解避免死锁的方法。 - **并发工具类**:了解ConcurrentHashMap、CopyOnWriteArrayList等并发...

    2013年7月 北京迅雷C++笔试题

    8. **多线程编程**:C++11提供了多线程支持,面试可能测试线程同步、互斥锁、条件变量等相关知识。 9. **文件操作**:C++的I/O流库(iostream)用于读写文件,可能有涉及打开、关闭文件、格式化输出等题目。 10. *...

    迅雷和其他公司的一些笔试题

    4. 操作系统:可能会涉及到进程与线程的概念、同步与通信(如互斥量、信号量、条件变量)、内存管理(如虚拟内存、堆、栈的理解)、文件系统等。这些都是程序员需要了解的系统层面知识。 5. 编译原理:虽然不是所有...

    易语言 e秒百科模块

    易语言模块 e秒百科模块 ------------------------------ .... .................................................................................参数 同步异步, 逻辑型, , 步通信方式(真) 同步方式(假) ............................................................................参数 进入许可证, 多线程许可证

    c语言项目开发实例

    7. **客户端和服务器通信**:这部分内容可能涉及到网络编程,如TCP/IP套接字编程,数据的打包和解包,以及多线程或异步处理。理解网络通信协议和数据传输是关键。 8. **潜艇大战游戏**:这是一个基于网络的多人游戏...

    JAVA 范例大全 光盘 资源

    实例120 多线程同步方法 352 实例121 取钱存钱(线程同步互斥) 354 实例122 谁唤醒了我(线程沉睡和唤醒) 357 实例123 让步传文件(线程让步) 359 实例124 爱子(守护线程) 361 实例125 有始有终(线程连接...

    北京Java私塾Java基础入门教程

    Java内置对多线程的支持,通过实现Runnable接口或继承Thread类创建线程,使用synchronized关键字进行同步控制,避免并发问题。 九、Java New1-8章节概览 "JavaNew1-8.pdf"可能涵盖了以上所述的基础知识,并逐步深入...

    2011年3G版Java核心课程

    6. **多线程**:Java提供了内置的多线程支持,包括Thread类和Runnable接口,以及同步机制如synchronized关键字、wait()、notify()等。 7. **反射机制**:Java反射机制允许在运行时动态地获取类的信息并操作类的对象...

    疯狂java讲义

    7. **多线程**:Java提供了丰富的线程API,源代码中会涉及到Thread类、Runnable接口,以及同步机制(synchronized,wait/notify,Lock等),帮助理解并发编程。 8. **网络编程**:可能会包含Socket编程示例,展示...

    vc++ 开发实例源码包

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    2017java面试题

    5. **多线程**:涉及Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()和notifyAll()方法),以及线程池的概念。 6. **IO流**:包括文件操作、字节流、字符流、缓冲流、转换流以及NIO(New ...

    vc++ 应用源码包_1

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_2

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_6

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_5

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_3

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

Global site tag (gtag.js) - Google Analytics