java多线程顺序输出ABCD

本文介绍了一个使用Java实现的多线程同步示例,通过四个线程分别向公共字符数组中按顺序写入A、B、C、D,确保输出符合预期的ABCD序列。文章提供了完整的代码实现,并通过单元测试验证了程序的正确性。

问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。

代码如下:

package huawei;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
 * 
 */
public class Demo extends Thread{
    private static String tmp ;
     private static Lock lock = new ReentrantLock();
     private static int state =0;
     static boolean flag;   

    public static String multiThreadWrite(final int times) {
            tmp =new String();
            flag=false;
         Thread threadA =new Thread()
         {
             public void run(){
                 int count =0;
                
                 while(count<times)
                    {
                    lock.lock();
                    if(state%4==0)
                    {
                
                    tmp += "A";
                    state++;
                    count++;
                    }
                    lock.unlock();
                    }
                 
         }
         };
         
    
             Thread threadB =new Thread()
         {
            
             public void run(){
                 int count =0;
                
                  while(count<times)
                    {

                      
                    lock.lock();
                    if(state%4==1)
                    {
                        
                    tmp += "B";
                    state++;
                    count++;
                    }
                    lock.unlock();
                    }
                 
         }
         };
         
             Thread threadC =new Thread()
         {
             public void run(){
                 int count=0;
                
                 while(count<times)
                    {
                    lock.lock();
                    if(state%4==2)
                    {
                    tmp += "C";
                    state++;
                    count++;
                    }
                    lock.unlock();
                    }
                 
         }
         };
         
             Thread threadD =new Thread()
         {
            
             public void run()
             {
                 int count =0;
            
                    while(count<times)
                    {
                    lock.lock();
                    if(state%4==3)
                    {
                    tmp += "D";
                    state++;
                    count++;
                    }
                    lock.unlock();
                    }
                     flag=true;
            }
         };
         
         threadA.start();
         threadB.start();
         threadC.start();
         threadD.start();
         while(!flag); //防止main线程在四个线程执行完之前就返回tmp值
     return tmp; 
    }
}
View Code

 

测试代码:

package testcase;

import huawei.Demo;
import junit.framework.TestCase;

public class DemoTest extends TestCase {
    
    private void execTestCase(int num) {
        String rst = Demo.multiThreadWrite(num);
        
        String seed = "ABCD";
        String chk = new String();
        for (int i = 0; i < num; i ++) {
            chk += seed;
        }
        assertEquals(chk, rst);
    }
    
    public void testCase01() {
        execTestCase(1);
    }
    
    public void testCase03() {
        execTestCase(15);
    }
    
}
View Code

 

 

转载于:https://www.cnblogs.com/poeticliving/p/3240523.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值