本文共 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/