zoukankan      html  css  js  c++  java
  • 多线程经典问题2——子线程之间交替问题

    编写一个程序。开启3个线程,这3个线程的ID分别为ABC,每一个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC.依次递推。


    这个问题仍旧是线程间的交替控制问题,分析方法还是能够同上一篇“多线程经典问题1——主线程子线程交替问题”。

    详细代码例如以下:

    package treadgame;
    
    /**
     * 线程间的交流1
     * 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,
     * 每一个线程将自己的ID在屏幕上打印10遍,
     * 要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
     * @author lcx
     *
     */
    public class ThreadExchange2 {
    
    	public static void main(String[] args) 
    	{
    		Resource2 res=new Resource2();
    		Thread td1=new Thread(new Subs('A',res));
    		Thread td2=new Thread(new Subs('B',res));
    		Thread td3=new Thread(new Subs('C',res));
    		td1.start();
    		td2.start();
    		td3.start();
    	}
    }
    
    class Resource2 
    {
    	int index=0;
    	public synchronized void runSub(char tag)
    	{
    		for(int i=0;i<10;i++)
    		{
    			while(tag-'A'!=index)
    			{
    				try {
    					wait();
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			System.out.print(tag);
    			index=(index+1)%3;
    			notifyAll();
    		}
    	}
    }
    
    class Subs implements Runnable
    {
    
    	char tag;
    	Resource2 res;
    	public Subs(char tag,Resource2 res)
    	{
    		this.tag=tag;
    		this.res=res;
    	}
    	public void run() {
    		res.runSub(tag);
    	}
    }

    必需要注意的是

    while(tag-'A'!=index)
    不能写成
    <pre name="code" class="java">if(tag-'A'!=index)
    否则会出现错误,由于notifyAll会唤醒剩下的两个线程。当中仅仅能有一个是正确的、需要运行的线程

    
    
    追问:之前说的子线程与主线程交替运行,为什么就能够在使用if来推断是否wait?
    由于假设本线程不是须要运行的线程。那么另外一个线程绝对是须要运行的线程,所以一个if即可。



  • 相关阅读:
    递归的形式过程
    c/c++程序员常见面试题分析(转)
    深入理解递归函数的调用过程(转)
    C语言union关键字
    中国象棋(java)
    求树中最低的公共祖先
    什么是Complement(补码)?
    LoadRunner,各协议之间的区别
    淘宝模板制作[店铺装修]学习过程+心得
    Tips of QTP
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7376202.html
Copyright © 2011-2022 走看看