当前位置: 代码迷 >> J2SE >> Java 多线程通信
  详细解决方案

Java 多线程通信

热度:90   发布时间:2016-04-23 19:39:00.0
Java 多线程通信求助
想写一个两个线程交替输出数字和字母的代码
public class MultiThreadPrint {
    private boolean flag=false;
    private int i=1;
    private int j=0;
    class DigitPrint extends Thread
    {
        @Override
        public void run() {
            for (;i<27;i++)
            {
                printDigit();
            }
        }
    }
    class LetterPrint extends Thread
    {
        @Override
        public void run() {
            for (;j<26;j++)
            {
                printLetter();
            }
        }
    }
    public synchronized void printDigit()
    {
        try {
            if (flag)
            {
                wait();
            }else {
                //System.out.print(i+""+(i+1));
                System.out.print(i);
                flag=true;
                notifyAll();
            }
        }catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
    public synchronized void printLetter()
    {
        try{
            if (!flag)
            {
                wait();
            }else {
                System.out.print((char)(j+65));
                flag=false;
                notifyAll();
            }
        }catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)
    {
        MultiThreadPrint multiThreadPrint=new MultiThreadPrint();
        multiThreadPrint.new DigitPrint().start();
        multiThreadPrint.new LetterPrint().start();
    }

}
为何输出结果是1A3C5E7G9I11K13M15O17Q19S21U23W25Y
本人初学Java线程方面,求大神指点。。
------解决思路----------------------
引用:
多线程不是每个线程依次输出,而是2个线程先抢时间片,随后运行,这样的结果只能说时间片抢的不均匀罢了,应该有办法控制。


引用:
多线程不是每个线程依次输出,而是2个线程先抢时间片,随后运行,这样的结果只能说时间片抢的不均匀罢了,应该有办法控制。


你看一查考这个:http://jeasonjack.iteye.com/blog/1844512
------解决思路----------------------

/**
 *
 * @author zys59三仙半(QQ:597882752)<br>
 *         创建时间:2015年10月20日 上午11:14:15
 */
public class MultiThreadPrint {

private boolean isLetter = false;
private int i = 1;
private int j = 0;
private DigitPrint digitPrint = new DigitPrint();
private LetterPrint letterPrint = new LetterPrint();


public MultiThreadPrint() {
digitPrint.start();
letterPrint.start();
}

class DigitPrint extends Thread {
private boolean bRun = true;

@Override
public void run() {
while (bRun) {
//System.out.println("DigitPrint-->i=" + i);
printDigit();
}
}

public void setBRun(boolean b) {
bRun = b;
}
}

class LetterPrint extends Thread {

private boolean bRun = true;

@Override
public void run() {
while (bRun) {
//System.out.println("LetterPrint-->j=" + j);
printLetter();
}
}

public void setBRun(boolean b) {
bRun = b;
}
}

public synchronized void printDigit() {
try {
if (isLetter) {
//System.out.println("printDigit-->isLetter=" + isLetter);
wait();
} else {
// System.out.print(i+""+(i+1));
System.out.print(i + " ");
i++;

if (i >= 27) {
digitPrint.setBRun(false);
}
isLetter = true;
notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public synchronized void printLetter() {
try {
if (!isLetter) {
//System.out.println("printLetter-->isLetter=" + isLetter);
wait();
} else {
System.out.print((char) (j + 65) + " ");
isLetter = false;
j++;
if (j >= 26) {
letterPrint.setBRun(false);
}
notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
MultiThreadPrint multiThreadPrint = new MultiThreadPrint();
}
}

------解决思路----------------------
解释一下你的程序
一开始flag为false,先打印数字1,然后把flag设置为true,并唤醒打印字母线程但是并不会立刻执行,然后i++,i=2,再次执行打印数字这个方法,但是会执行wait方法,让出cpu,这个时候运行打印字母的线程,先打印A,然后把flag设置为false,并唤醒打印数字线程但是不会立刻执行,然后j++,j=2,再次执行打印字母的方法,但是执行wait方法,让出cpu,由于打印数字的线程被唤醒,再次循环i++,i=3,再次运行打印方法,打印出3,flag设置为true,唤醒所有线程,然后循环,i++,i=4,又调用wait方法,轮到打印字母的线程,执行j++,j=3,打印出字母C
依此类推,每个线程打印一下,自增一下,但是立刻调用wait方法,下次该它执行时先++,再打印,因此都相差2
  相关解决方案