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。

java实现全排列问题

8排列组合

算法9-----输出全排列(递归)

滑动窗口算法-3

剑指Offer(Java版)第三十二题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc, 则打印出由字符a,b,c所能排列出来的 所有字符串abc,acb,bac,bc