java三个线程ABC输出ABC CBA BAC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java三个线程ABC输出ABC CBA BAC相关的知识,希望对你有一定的参考价值。
用同步还有notify,wait什么的,http://pan.baidu.com/s/1hqkmvT6写了一个,没出效果,问题也有点大,B线程都没输出
package p1;/**
* 在主线程中开启3个子线程,分别实现打印字符串 012 345 678 (3) "ABC"-->"CBA"-->"BAC"
*
* @author Administrator
*
*/
public class OpenThreeThread_three extends Thread
private static Object LOCK = new Object();
private static int p = 0;
private static int[] notifyarr = 1, 2, 3, 3, 2, 1, 2, 1, 3 ;
public static void main(String[] args)
OpenThreeThread_three A = new OpenThreeThread_three()
public void run()
for (int i = 0; i < 3; i++)
synchronized (LOCK)
while (notifyarr[p] != 1)
LOCK.notifyAll();
try
LOCK.wait();
catch (InterruptedException e)
e.printStackTrace();
System.out.println("A" + i);
p++;
LOCK.notifyAll();
;
OpenThreeThread_three B = new OpenThreeThread_three()
public void run()
for (int i = 0; i < 3; i++)
synchronized (LOCK)
while (notifyarr[p] != 2)
LOCK.notifyAll();
try
LOCK.wait();
catch (InterruptedException e)
e.printStackTrace();
System.out.println("B" + i);
p++;
LOCK.notifyAll();
;
OpenThreeThread_three C = new OpenThreeThread_three()
public void run()
for (int i = 0; i < 3; i++)
synchronized (LOCK)
while (notifyarr[p] != 3)
LOCK.notifyAll();
try
LOCK.wait();
catch (InterruptedException e)
e.printStackTrace();
System.out.println("C" + i);
p++;
LOCK.notifyAll();
;
A.setName("A");
B.setName("B");
C.setName("C");
/*
* A.setPriority(4); B.setPriority(5); C.setPriority(3);
*/
A.start();
B.start();
C.start();
追问
大神,我基础差,要不你帮我补点注释0.0
追答 private static int p = 0;private static int[] notifyarr = 1, 2, 3, 3, 2, 1, 2, 1, 3 ;
//notifyarr 线程执行顺序,比如p=3; notifyarr[p]==3就执行第三个线程。
public void run()
//for循环每个线程执行三遍
for (int i = 0; i < 3; i++)
//进入循环获取同步锁
synchronized (LOCK)
//while循环,判断要执行的方法是不是本方法,执行序列在notifyarr //中定义了
while (notifyarr[p] != 3)
LOCK.notifyAll();//如果不是本方法通知其他继续执行
try
LOCK.wait();//进入等待
catch (InterruptedException e)
e.printStackTrace();
System.out.println("C" + i);
p++; //进入下一个要执行的方法
LOCK.notifyAll();//通知其他
额。。我不是什么大神啊,其实就是一个同步问题,关键代码注释了。
为什么写了两个notifyall呢?而外面那个notifyall不用写wait呢
追答抱歉 ,while里的那个notifyall其实不需要的。
追问lock.wait之后后面是怎么执行的啊^ω^
追答不如说A线程吧,while (notifyarr[p] != 1)为真的话也就是说要执行的不是A线程,A线程就会执行LOCK.wait释放锁,而其他线程得到锁后如果判断while (notifyarr[p] != 1)为假即要执行的是自己就会继续执行p++; lock.notifyall();结束自己并通知其他wait中的线程,其他线程继续判断。。。。。就是这么个过程。
参考技术A 其实线程是有执行时间的,它的输出也是按执行时间来排的,你是要人为控制执行时间吗?请采纳。追问
这个是可以的!反正只要线程按照ABC CBA BAC顺序就行
以上是关于java三个线程ABC输出ABC CBA BAC的主要内容,如果未能解决你的问题,请参考以下文章
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
剑指Offer(Java版)第三十二题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc, 则打印出由字符a,b,c所能排列出来的 所有字符串abc,acb,bac,bc