博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
华为oj,多线程。。保证四个线程按顺序循环输出
阅读量:4298 次
发布时间:2019-05-27

本文共 3747 字,大约阅读时间需要 12 分钟。

问题描述:有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类型的指针,用于初始化输出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按顺序向该数组赋值。

首先想到一个办法,但是总是会出现死锁的情况,看到有的博友也贴出来过。方法如下:

class MyThread extends Thread {
static int count; static char characterS = 'A'; public static String lock = "lock"; char characterP; public MyThread(char character) { this.characterP = character; } public MyThread(char character, int num) { this.characterP = character; count = num; } @Override public void run() { super.run(); for (int i = 0; i < count; i++) { printC(); } } public void printC() { while (characterS != characterP){// try {
// Thread.sleep(100);// } catch (InterruptedException e) {
// e.printStackTrace();// } } synchronized (lock) { System.out.print(characterP); characterS += 1; if (characterS == 'E') { characterS = 'A'; } } }}public class Main {
public static void main(String[] args) throws InterruptedException { Scanner scanner = new Scanner(System.in); int sum = scanner.nextInt(); new MyThread('A', sum).start(); new MyThread('B').start(); new MyThread('C').start(); new MyThread('D').start(); }}

然后呢,就做了改进,使用线程之前的通讯来实现:

class Print{
private static char FLAG = 'A'; synchronized void print(char charI){ while (charI != FLAG) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(FLAG); FLAG += 1; if (FLAG == 'E') { FLAG = 'A'; } notifyAll(); }}class PrintA extends Thread{
public static int count ; private Print print; public PrintA(Print print, int count) { this.print = print; this.count = count; } @Override public void run() { for (int i = 0; i < count; i++) { print.print('A'); } }}class PrintB extends Thread{
private Print print; public PrintB(Print print) { this.print = print; } @Override public void run() { for (int i = 0; i < PrintA.count; i++) { print.print('B'); } }}class PrintC extends Thread{
private Print print; public PrintC(Print print) { this.print = print; } @Override public void run() { for (int i = 0; i < PrintA.count; i++) { print.print('C'); } }}class PrintD extends Thread{
private Print print; public PrintD(Print print) { this.print = print; } @Override public void run() { for (int i = 0; i < PrintA.count; i++) { print.print('D'); } }}public class Other {
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int sum = scanner.nextInt(); Print print = new Print();//保证print对象是唯一的。 new PrintA(print, sum).start(); new PrintB(print).start(); new PrintC(print).start(); new PrintD(print).start(); }}

这个方法基本上就是跟java书上的方法差不多。只是加了一个静态变量,做标志,判断哪个进程应该输出。

另外觉得疯狂java讲义上的一个地方有错误:

if(flag){    wait();}else{    ...    notifyAll();    ...}

线程等待之后被激活,else怎么运行?应该就不能加else。

转载地址:http://lsnws.baihongyu.com/

你可能感兴趣的文章
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>
Linux 系统挂载数据盘
查看>>
Git基础(三)--常见错误及解决方案
查看>>
Git(四) - 分支管理
查看>>
PHP Curl发送数据
查看>>
HTTP协议
查看>>
HTTPS
查看>>