华为OJ训练之0030-170110-多线程
2017-03-19 17:20
459 查看
题目
===============================================问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。[注:C语言选手可使用WINDOWS SDK库函数]
接口说明:
void init(); //初始化函数
void Release(); //资源释放函数
unsignedint__stdcall ThreadFun1(PVOID pM) ; //线程函数1,传入一个int类型的指针[取值范围:1 – 250,测试用例保证],用于初始化输出A次数,资源需要线程释放
unsignedint__stdcall ThreadFun2(PVOID pM) ;//线程函数2,无参数传入
unsignedint__stdcall ThreadFun3(PVOID pM) ;//线程函数3,无参数传入
Unsigned int __stdcall ThreadFunc4(PVOID pM);//线程函数4,无参数传入
char g_write[1032]; //线程1,2,3,4按顺序向该数组赋值。不用考虑数组是否越界,测试用例保证
知识点 字符串,循环,链表,队列,栈,查找,搜索,排序,树,图,数组,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入
输入一个int整数
输出
输出多个ABCD
样例输入 10
样例输出 ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD
100在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同
时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资
源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥
出来。
在Java中,ReadWriteLock这个接口就为我们实现了这个需求,通过他的实现类ReentrantReadWriteLock我们可
以很简单的来实现刚才的效果,下面我们使用一个例子来说明这个类的用法。
[java] view plain copy print?
package com.bird.concursey.charpet3;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class PricesInfo {
private double price1; private double price2; private ReadWriteLock lock; public PricesInfo() { price1 = 1.0; price2 = 2.0; lock = new ReentrantReadWriteLock(); } public double getPrice1() { //读取资源锁定 lock.readLock().lock(); double value = price1; lock.readLock().unlock(); return value; } public double getPrice2() { lock.readLock().lock(); double value = price2; lock.readLock().unlock(); return value; } public void setPrices(double price1, double price2) { lock.writeLock().lock(); this.price1 = price1; this.price2 = price2; lock.writeLock().unlock(); }
}
===============================================
package package02; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; import javax.swing.plaf.SliderUI; //问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。[注:C语言选手可使用WINDOWS SDK库函数] //接口说明: //void init(); //初始化函数 //void Release(); //资源释放函数 //unsignedint__stdcall ThreadFun1(PVOID pM) ; //线程函数1,传入一个int类型的指针[取值范围:1 – 250,测试用例保证],用于初始化输出A次数,资源需要线程释放 //unsignedint__stdcall ThreadFun2(PVOID pM) ;//线程函数2,无参数传入 //unsignedint__stdcall ThreadFun3(PVOID pM) ;//线程函数3,无参数传入 //Unsigned int __stdcall ThreadFunc4(PVOID pM);//线程函数4,无参数传入 //char g_write[1032]; //线程1,2,3,4按顺序向该数组赋值。不用考虑数组是否越界,测试用例保证 //知识点 字符串,循环,链表,队列,栈,查找,搜索,排序,树,图,数组,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归 //运行时间限制 10M //内存限制 128 //输入 //输入一个int整数 //输出 //输出多个ABCD //样例输入 10 //样例输出 ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD public class oj030 { private ReadWriteLock lock=new ReentrantReadWriteLock(); private int n=0; public oj030(int n) { this.n=n; } private List<Character> list=new ArrayList<Character>(); private Thread threadA=new Thread(new Runnable() { @Override public void run() { int na=0; while(na!=n) { lock.writeLock().lock(); if(list.size()%4==0) { list.add('A'); na++; } lock.writeLock().unlock(); } } }); private Thread threadB=new Thread(new Runnable() { @Override public void run() { int nb=0; while(nb!=n) { lock.writeLock().lock(); if(list.size()%4==1) { list.add('B'); nb++; } lock.writeLock().unlock(); } } }); private Thread threadC=new Thread(new Runnable() { @Override public void run() { int nc=0; while(nc!=n) { lock.writeLock().lock(); if(list.size()%4==2) { list.add('C'); nc++; } lock.writeLock().unlock(); } } }); private Thread threadD=new Thread(new Runnable() { @Override public void run() { int nd=0; while(nd!=n) { lock.writeLock().lock(); if(list.size()%4==3) { list.add('D'); nd++; } lock.writeLock().unlock(); } } }); public void startThread() { threadA.start(); threadB.start(); threadC.start(); threadD.start(); } public void display() { try { threadA.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } lock.readLock().lock(); if(list!=null) { for(Character c:list) { System.out.print(c); } } lock.readLock().unlock(); } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); oj030 oj=new oj030(n); oj.startThread(); oj.display(); } }
相关文章推荐
- 华为OJ训练之0031-170110-明明的随机数
- 华为OJ训练之0006-161229-输出前k个最小数字
- 华为OJ训练之0020-170106-等差数列(寻找等差数列)
- 华为OJ机试训练(一)
- 华为OJ训练之0007-151230-统计大写字母个数
- 华为OJ训练之0021-170106-尼科彻斯定理
- 华为OJ训练之0022-170107-24点游戏
- 华为OJ多线程
- 华为OJ训练 之 括号配对数目问题
- 华为OJ训练之0034-170112-密码强度等级
- 华为OJ训练之0041-170115-合并数据表记录
- 华为OJ训练之0008-161230-输出链表倒数第k个数字
- 华为OJ多线程问题
- 华为OJ训练之0023-170107-字符串的相似度
- 华为OJ训练之0042-170115-整形数组排序
- 华为OJ训练之0009-161231-统计二进制数字中1的个数(求int型数据在内存中存储时1的个数)
- 华为OJ训练之0024-170107-杨辉三角的变形
- 华为OJ机试训练(一)
- 华为OJ训练之0035-170112-字符串加解密
- 华为OJ训练之0043-170220-蛇形矩阵