`
hollowinhart
  • 浏览: 129244 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

有三个线程ID分别是A、B、C,用多线编程实现,在屏幕上循环打印10次ABCABC…

阅读更多
class Worker implements Runnable{  
   
    /** 全局的一个信息,用来确定是哪个线程在工作 */
    private static int count = 0;  
      
    /** 线程的标志 */
    private int id;  
   
    /** 线程已工作次数 */
    private int pCount;  
      
    public Worker(int id){  
        this.id = id;  
    }  
      
    public void run() {  
        synchronized ("lock") {  
            for (;;) {  
                if(count%3==id){  
                    System.out.print(Thread.currentThread().getName());  
                    count++;  
                    pCount++;  
                    "lock".notifyAll();  
                    if(pCount==10)  
                        break;  
                }else{  
                    try {  
                        "lock".wait();  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  


    public static void main(String[] args)
    {
       
        new Thread(new Worker(0),"A").start();  
        new Thread(new Worker(1),"B").start();  
        new Thread(new Worker(2),"C").start(); 
    }
分享到:
评论
2 楼 badhorse 2010-08-03  
前面的代码有个多线程方面的bug. 粗体部分是修改后的代码。


/**
 * 若干个LinkedThread线程可以依次串联起来,形成一条链(或一个环),
 * 这条链(或环)的特点是:只有当上游线程执行完任务之后,下游线程才开始执行。这类似于接力赛跑的情形
 * ,每个LinkedThread线程相当于一个运动员,某个运动员跑完当前赛段后,就把接力棒交给下一个运动员。
 * 
 * @author Yubing Ma
 * 
 */
public class LinkedThread extends Thread {
	private LinkedThread previousThread;

	public void setPreviousThread(LinkedThread previousThread) {
		this.previousThread = previousThread;
	}

	public LinkedThread(LinkedThread previousThread, String msgToPrint) {
		this.previousThread = previousThread;
		this.msgToPrint = msgToPrint;
	}

	// 指示本线程是否已经完成当前任务。可以将此变量想象成一个接力棒。
	private boolean isFinished;

	private String msgToPrint;

	private static final int roundCount = 1000; // 重复执行任务的次数,可想象为接力赛跑的圈数

	public void run() {
		try {
			for (int i = 0; i < roundCount; i++) {
				waitPreviousThreadToFinish();
				doSomething();
				setFinishedFlag();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private void waitPreviousThreadToFinish() throws InterruptedException {
		[b]synchronized (previousThread) {
			while (!previousThread.isFinished) {
				previousThread.wait();
			}
		}[/b]

		previousThread.isFinished = false;
	}

	/**
	 * 设置本线程为“任务已完成”状态,这将触发下游线程的执行。
	 */
	private void setFinishedFlag() {
		synchronized (this) {
			isFinished = true;
			this.notifyAll();
		}
	}

	private void doSomething() throws InterruptedException {
		System.out.print(msgToPrint);
	}

	public static void main(String[] args) throws InterruptedException {
		// 创建若干个线程,这些线程被串联成一个有向环,只有当上游线程执行完成之后,下游线程才会执行
		LinkedThread threadA = new LinkedThread(null, "A");
		LinkedThread threadB = new LinkedThread(threadA, "B");
		LinkedThread threadC = new LinkedThread(threadB, "C ");
		threadA.setPreviousThread(threadC); // 线程C成为A的上游,这样就形成一个封闭的环

		threadA.start();
		threadB.start();
		threadC.start();
		threadC.setFinishedFlag(); // 设置线程C为“已完成”状态,这将触发下游线程(线程A)开始执行
	}
}
1 楼 badhorse 2010-08-03  
/**
 * 若干个LinkedThread线程可以依次串联起来,形成一条链(或一个环),
 * 这条链(或环)的特点是:只有当上游线程执行完任务之后,下游线程才开始执行。这类似于接力赛跑的情形
 * ,每个LinkedThread线程相当于一个运动员,某个运动员跑完当前赛段后,就把接力棒交给下一个运动员。
 * 
 * @author Yubing Ma
 * 
 */
public class LinkedThread extends Thread {
	private LinkedThread previousThread;

	public void setPreviousThread(LinkedThread previousThread) {
		this.previousThread = previousThread;
	}

	public LinkedThread(LinkedThread previousThread, String msgToPrint) {
		this.previousThread = previousThread;
		this.msgToPrint = msgToPrint;
	}

	// 指示本线程是否已经完成当前任务。可以将此变量想象成一个接力棒。
	private boolean isFinished;

	private String msgToPrint;

	private static final int roundCount = 10; // 重复执行任务的次数,可想象为接力赛跑的圈数

	public void run() {
		try {
			for (int i = 0; i < roundCount; i++) {
				waitPreviousThreadToFinish();
				doSomething();
				setFinishedFlag();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private void waitPreviousThreadToFinish() throws InterruptedException {
		while (!previousThread.isFinished) {
			synchronized (previousThread) {
				previousThread.wait();
			}
		}

		previousThread.isFinished = false;
	}

	private void doSomething() throws InterruptedException {
		System.out.println(msgToPrint);
	}

	/**
	 * 设置本线程为“任务已完成”状态,这将触发下游线程的执行。
	 */
	private void setFinishedFlag() {
		synchronized (this) {
			isFinished = true;
			this.notifyAll();
		}
	}

	public static void main(String[] args) throws InterruptedException {
		// 创建若干个线程,这些线程被串联成一个有向环,只有当上游线程执行完成之后,下游线程才会执行
		LinkedThread threadA = new LinkedThread(null, "A");
		LinkedThread threadB = new LinkedThread(threadA, "B");
		LinkedThread threadC = new LinkedThread(threadB, "C");
		threadA.setPreviousThread(threadC); // 线程C成为A的上游,这样就形成一个封闭的环

		threadA.start();
		threadB.start();
		threadC.start();
		threadC.setFinishedFlag(); // 设置线程C为“已完成”状态,这将触发下游线程(线程A)开始执行
	}
}

    [*]
[b][/b]

相关推荐

    <一>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

     有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 通过一个标志位来处理的方式虽然可以实现效果,但是还不够安全,极...

    <二>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

    有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:...

    浅谈Python3多线程之间的执行顺序问题

    在Python3中,多线程编程允许我们同时执行多个任务,但线程的执行顺序并不是预先确定的,而是由操作系统的线程调度器决定。在给出的标题和描述中,提出了一个具体的问题:如何控制三个线程按照特定的顺序(ABCABC…...

    java信号量控制线程打印顺序的示例分享

    在这个示例中,信号量被用来控制三个线程(A、B、C)按照特定顺序(ABCABC...)打印字符。以下是关于Java信号量及其在示例中的应用的详细解释: 1. **什么是信号量?** 信号量是一个计数器,可以理解为一种许可证...

    C语言概念题解答选编及答案

    - **问题**:给出两个布尔变量m和n,其中m = a &gt; b && n = a &gt; b,如果a和b的值分别为1和2,那么m和n的值是什么? - **答案**:由于a不大于b,所以m和n的值均为0(假)。在C语言中,逻辑与(&&)操作符需要两边的...

    试卷python软件编程等级考试(三级)编程实操题02练习.pdf

    print(a,b)`执行后,`a`和`b`的值分别是`3`和`2`。 【Python输出函数】 在Python中,`print()`函数用于输出内容。 【Python控制结构】 多分支选择结构在Python中通常通过`if-elif-else`实现。示例代码`if-else`...

    C语言基础考试题及答案3

    14. `fopen`函数的"r+"模式允许读写操作,因此在打开文件时使用"r+"可以实现读写。 以上就是C语言基础考试题的相关知识点详解,涵盖了位运算、函数、指针、字符串、结构体、文件操作等多个方面。学习C语言时,这些...

    资料python软件编程等级考试(二级)编程实操题.pdf

    9. **字符串操作**:Python中的字符串连接可以使用`+`,所以 `ab"+"c"*2`的结果是 `abcabc`,选项B正确。 10. **Python数据类型**:Python支持的数据类型中没有`char`,选项A错误。 11. **条件分支**:在给定的...

    试题python基础试题(含答案)练习.pdf

    16. 字符串`a="python"`,切片`a[1:3]`将获取第二个和第三个字符,即`'py'`。 17. 可以作为Python变量名的有字母、数字和下划线组成,且不能以数字开头,例如D `ababcc`。 18. 运行结果正确的Python程序未给出,...

    《Python语言及应用》期末试卷(B)含答案.doc

    《Python语言及应用》期末试卷(B)涵盖了Python编程的基础知识,包括语法、数据类型、运算符、内存管理、程序执行方式、语句块的标记、算法概念、Python特性以及面向对象编程的基本概念。以下是根据试卷内容展开的...

    2022年高等教育自学考试计算机基础与程序设计试题.doc

    10. **数据输入**:在C语言中,使用`scanf`函数输入数据,正确的格式是`scanf("%d,%d", &a, &b)`,所以正确的输入是2,3(回车)。 11. **条件运算符**:`y=x&gt;12?x+10:x-12;`表示如果x大于12,则y=x+10,否则y=x-12...

    资料全国青少年软件编程(Python)等级考试试卷(三级)2word练习.docx

    - 程序中涉及了求解二次方程的根,`(-b+math.sqrt(d))/(2*a)` 是一个根,另一个根是 `(-b-math.sqrt(d))/(2*a)`。 - 在Python中,输入数据通常使用 `input()` 函数,而 `void` 不是Python的关键字。 10. Pandas库...

    程序员求职应聘必读pdf

    在这个例子中,`hanoi`函数代表了汉诺塔问题的基本移动步骤,参数分别代表盘子的数量以及三个柱子的标识。不同的参数组合代表了不同的移动顺序,用于解决不同情况下的汉诺塔问题。 以上几个知识点都是程序员在求职...

    NCT全国青少年编程能力等级测试python二级优质word练习.pdf

    15. **Python变量赋值**:在Python中,`a=b`表示将`b`的值赋给`a`,而不是交换两个变量的值。 16. **应用软件**:Python不在应用软件的范畴内,它是一种编程语言,而Word、微信和考试系统都是应用软件的例子。 17....

    算法文档无代码浅析“最小表示法”思想在字符串循环同构问题中的应用

    标题中提到的“最小表示法”是一种解决字符串问题的算法思想,特别是在处理字符串循环同构问题时非常有用。在深入了解之前,我们首先要明白几个基本概念。 字符串循环同构是指一个字符串可以被看作是另一个字符串的...

    编程NCT等级测试-Python编程二级真题测试卷2word练习.pdf

    【编程NCT等级测试-Python编程二级真题测试卷2word练习.pdf】这份文档是针对Python编程二级考试的真题练习,旨在帮助学习者检验和提升自己的Python编程能力。Python是一种高级编程语言,以其简洁易读的语法和广泛的...

    NCT等级测试-Python编程一级真题测试卷1图文练习.pdf

    20. **print命令**:`print()`用于在屏幕中输出文本或数字,可以输出多个值,用逗号分隔。 21. **原始字符串**:以`r`或`R`开头的字符串表示原始字符串,不会转义`\n`,所以输出结果是`\nGood`。 22. **源代码类型...

    软通python机试考题总结.docx

    10. 计算机中信息处理和信息储存用():A 二进制代码 解释:在计算机中,信息处理和信息储存通常使用二进制代码。 11. python 源程序执行的方式():B 解析执行 解释:在 Python 中,源程序执行的方式是解析...

    计算机笔试题库集(含有答案)

    题中提到的实现三个线程循环打印“ABCABC…”,可以通过继承Thread类或实现Runnable接口,并使用synchronized关键字控制同步,确保打印顺序。 6. **字符串处理**:去除字符串中特定字符,不使用内置方法,可以...

    c语言 字符串模式匹配KMP实验

    例如,模式串"abcabc"的部分匹配表为[0, 0, 1, 0, 2, 0],表示"abcabc"的前两个字符没有公共前缀,第三个字符"a"的前缀和后缀都是它自身,以此类推。 2. **主串与模式串匹配**:初始化两个指针i和j,分别指向主串S...

Global site tag (gtag.js) - Google Analytics