/****************************************************************
* 迅雷笔试题:
* 有三个线程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();
}
}
分享到:
相关推荐
### 传智播客_Java培训_毕向东_Java基础[05-多线程] #### 1. 进程与线程的概念 在计算机科学领域中,**进程**是程序的一次动态执行过程,而**线程**则是进程内的一个执行单元。简单来说,一个程序启动后就是一个...
- 迅雷多线程下载:将一个大文件分成多个小块,每个小块由一个线程负责下载,大大提升了下载速度。 - **多线程安全问题及其解决方案** - 当多个线程访问同一共享资源时,如果没有适当的同步措施,可能会出现数据...
7. **多线程编程**:随着多核处理器的普及,掌握多线程编程技术,如线程同步、互斥锁、条件变量等,成为高级C++程序员的必备技能。 8. **网络编程**:对于迅雷这样的互联网公司而言,理解TCP/IP协议、socket编程,...
多线程 - **线程创建**:理解Thread类和Runnable接口的使用方法。 - **同步与死锁**:掌握synchronized关键字的用法,了解避免死锁的方法。 - **并发工具类**:了解ConcurrentHashMap、CopyOnWriteArrayList等并发...
8. **多线程编程**:C++11提供了多线程支持,面试可能测试线程同步、互斥锁、条件变量等相关知识。 9. **文件操作**:C++的I/O流库(iostream)用于读写文件,可能有涉及打开、关闭文件、格式化输出等题目。 10. *...
4. 操作系统:可能会涉及到进程与线程的概念、同步与通信(如互斥量、信号量、条件变量)、内存管理(如虚拟内存、堆、栈的理解)、文件系统等。这些都是程序员需要了解的系统层面知识。 5. 编译原理:虽然不是所有...
易语言模块 e秒百科模块 ------------------------------ .... .................................................................................参数 同步异步, 逻辑型, , 步通信方式(真) 同步方式(假) ............................................................................参数 进入许可证, 多线程许可证
7. **客户端和服务器通信**:这部分内容可能涉及到网络编程,如TCP/IP套接字编程,数据的打包和解包,以及多线程或异步处理。理解网络通信协议和数据传输是关键。 8. **潜艇大战游戏**:这是一个基于网络的多人游戏...
实例120 多线程同步方法 352 实例121 取钱存钱(线程同步互斥) 354 实例122 谁唤醒了我(线程沉睡和唤醒) 357 实例123 让步传文件(线程让步) 359 实例124 爱子(守护线程) 361 实例125 有始有终(线程连接...
Java内置对多线程的支持,通过实现Runnable接口或继承Thread类创建线程,使用synchronized关键字进行同步控制,避免并发问题。 九、Java New1-8章节概览 "JavaNew1-8.pdf"可能涵盖了以上所述的基础知识,并逐步深入...
6. **多线程**:Java提供了内置的多线程支持,包括Thread类和Runnable接口,以及同步机制如synchronized关键字、wait()、notify()等。 7. **反射机制**:Java反射机制允许在运行时动态地获取类的信息并操作类的对象...
7. **多线程**:Java提供了丰富的线程API,源代码中会涉及到Thread类、Runnable接口,以及同步机制(synchronized,wait/notify,Lock等),帮助理解并发编程。 8. **网络编程**:可能会包含Socket编程示例,展示...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
5. **多线程**:涉及Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()和notifyAll()方法),以及线程池的概念。 6. **IO流**:包括文件操作、字节流、字符流、缓冲流、转换流以及NIO(New ...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...