有三个线程名字分别是A、B、C,每个线程只能打印自己的名字,在屏幕上顺序打印 ABC,打印10次。

今天去面试的时候,遇到的笔试题,当时没有想到,回来学习记录下。今天去面试的时候,遇到的笔试题,当时没有想到,回来学习记录下。

public class TestPrintOrder {
	public static void main(String[] args) {
		AtomicInteger atomic = new AtomicInteger();
		Print tPrint = new Print();
		Thread threadA = new ThreadTest("A", 0, tPrint, 10, atomic);
		Thread threadB = new ThreadTest("B", 1, tPrint, 10, atomic);
		Thread threadC = new ThreadTest("C", 2, tPrint, 10, atomic);
		threadA.start();
		threadB.start();
		threadC.start();
	}
}
class ThreadTest extends Thread{
	private String name = "";
	private Integer id = 0;
	private Print tPrint = null;
	private int count = 0;
	AtomicInteger atomic  = null;
	public ThreadTest(String name, Integer id, Print tPrint, int count,
			AtomicInteger atomic) {
		super();
		this.name = name;
		this.id = id;
		this.tPrint = tPrint;
		this.count = count;
		this.atomic = atomic;
	}
	public void run(){
		while(count > 0){
			if(atomic.get() % 3 == id){
				tPrint.printName(name);
				count --;
				atomic.getAndIncrement();
			}
		}
	}
}
/**
 * 打印
 */
class Print{
	void printName(String name){
		System.out.print(name);
	}
}

1.设计上注意,把打印这个对象独立出来,以便控制资源的同步
2.使用atomic类原子性控制线程的执行,此处的取模,相当于一个变量标识
3.如果是打印一遍,使用线程的join(),比较便捷。



public class TestPrintOrder1 {
	public static void main(String[] args) throws InterruptedException {
		Thread testA = new TestThread("A");
		Thread testB = new TestThread("B");
		Thread testC = new TestThread("C");
		testA.start();
		testA.join();
		testB.start();
		testB.join();
		testC.start();
	}
}
class TestThread extends Thread{
	String name = "";
	public TestThread(String name){
		this.name = name;
	}
	public void run(){
		System.out.print(name);
	}
}


参考文章 :http://blog.csdn.net/seapeak007/article/details/53437339

可以使用信号量来实现三个线程顺序打印ABC的需求,每个线程持有一个信号量,控制打印顺序。 具体实现如下: ```python import threading class PrintABC: def __init__(self): self.count = 10 self.sem_a = threading.Semaphore(1) # 线程A的信号量,初始值为1 self.sem_b = threading.Semaphore(0) # 线程B的信号量,初始值为0 self.sem_c = threading.Semaphore(0) # 线程C的信号量,初始值为0 def print_a(self): for i in range(self.count): self.sem_a.acquire() # 获取信号量 print('A', end='') self.sem_b.release() # 释放下一个信号量 def print_b(self): for i in range(self.count): self.sem_b.acquire() # 获取信号量 print('B', end='') self.sem_c.release() # 释放下一个信号量 def print_c(self): for i in range(self.count): self.sem_c.acquire() # 获取信号量 print('C', end='') self.sem_a.release() # 释放下一个信号量 if __name__ == '__main__': p = PrintABC() t1 = threading.Thread(target=p.print_a) t2 = threading.Thread(target=p.print_b) t3 = threading.Thread(target=p.print_c) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() ``` 这里定义了一个 `PrintABC` 类,其中包含三个方法 `print_a`、`print_b` 和 `print_c`,分别用来打印字母 A、B 和 C。每个方法中都使用了信号量来控制打印顺序,其中线程 A 的信号量初始值为 1,而线程 B 和线程 C 的信号量初始值都为 0。 在 `print_a` 方法中,线程 A 先获取信号量,打印字母 A,然后释放线程 B 的信号量,以此类推。 最后,启动三个线程并等待它们结束,输出的结果为: ``` ABCABCABCABCABCABCABCABCABCABC ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值