想写一个两个线程交替输出数字和字母的代码
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线程方面,求大神指点。。
------解决思路----------------------
你看一查考这个: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