疯狂习题:写2个线程,其中一个线程打印1-52,另一个线程打印A-Z,打印的顺序应该是12A34B56C...5152Z。 10
packagehz89.me.test;publicclasstest01{publicstaticvoidmain(String[]args){Printprint=n...
package hz89.me.test;
public class test01 {
public static void main(String[] args) {
Print print = new Print();
new printNum(print).start();
new printChar(print).start();
}
}
class Print {
private boolean flag = true;
public synchronized void printNum(int i) {
try {
if (flag) {
System.out.print(i);
if (i % 2 == 0) {
flag = false;
notifyAll();
}
} else {
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void printChar(char chars) {
try {
if (!flag) {
System.out.print(chars);
flag = true;
notifyAll();
} else {
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class printNum extends Thread {
Print p = new Print();
public printNum(Print p) {
this.p = p;
}
@Override
public void run() {
for (int i = 1; i < 53; i++) {
p.printNum(i);
}
}
}
class printChar extends Thread {
Print p = new Print();
public printChar(Print p) {
this.p = p;
}
@Override
public void run() {
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 0; i < str.length(); i++) {
p.printChar(str.charAt(i));
}
}
}
为啥打印出来是这个呢?
12A4C6E8G10I12K14M16O18Q20S22U24W26Y28。。。
求助!!! 展开
public class test01 {
public static void main(String[] args) {
Print print = new Print();
new printNum(print).start();
new printChar(print).start();
}
}
class Print {
private boolean flag = true;
public synchronized void printNum(int i) {
try {
if (flag) {
System.out.print(i);
if (i % 2 == 0) {
flag = false;
notifyAll();
}
} else {
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void printChar(char chars) {
try {
if (!flag) {
System.out.print(chars);
flag = true;
notifyAll();
} else {
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class printNum extends Thread {
Print p = new Print();
public printNum(Print p) {
this.p = p;
}
@Override
public void run() {
for (int i = 1; i < 53; i++) {
p.printNum(i);
}
}
}
class printChar extends Thread {
Print p = new Print();
public printChar(Print p) {
this.p = p;
}
@Override
public void run() {
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 0; i < str.length(); i++) {
p.printChar(str.charAt(i));
}
}
}
为啥打印出来是这个呢?
12A4C6E8G10I12K14M16O18Q20S22U24W26Y28。。。
求助!!! 展开
1个回答
展开全部
看我的
package test;
public class NumThread extends Thread {
private Printer printer;
public NumThread(Printer printer) {
this.printer = printer;
}
@Override
public void run() {
for(int i=1;i<=52;i++){
synchronized (printer) {
if(i % 2 ==0){
printer.print(i);
printer.notify();
}else {
printer.print(i);
}
}
if(i % 2 ==0){
synchronized (printer) {
try {
printer.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public Printer getPrinter() {
return printer;
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
package test;
public class CharThread extends Thread {
private Printer printer;
public CharThread(Printer printer) {
this.printer = printer;
}
@Override
public void run() {
for(int i=0;i<26;i++){
synchronized (printer) {
printer.print((char)('A'+i));
printer.notify();
}
if(i== 25){
return;
}
synchronized (printer) {
try {
printer.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public Printer getPrinter() {
return printer;
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
package test;
public class Printer {
public void print(Object obj){
System.out.print(obj.toString());
}
}
package test;
public class TestPrint {
public static void main(String[] args) {
Printer printer = new Printer();
Thread numThread = new Thread(new NumThread(printer));
Thread charThread = new Thread(new CharThread(printer));
numThread.start();
charThread.start();
}
}
//下面说明
两个线程循环打印数据,属于线程间通信,因此如果要线程间通信,就需要两个线程执行时获取同一把锁(这里为Printer对象)
package test;
public class NumThread extends Thread {
private Printer printer;
public NumThread(Printer printer) {
this.printer = printer;
}
@Override
public void run() {
for(int i=1;i<=52;i++){
synchronized (printer) {
if(i % 2 ==0){
printer.print(i);
printer.notify();
}else {
printer.print(i);
}
}
if(i % 2 ==0){
synchronized (printer) {
try {
printer.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public Printer getPrinter() {
return printer;
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
package test;
public class CharThread extends Thread {
private Printer printer;
public CharThread(Printer printer) {
this.printer = printer;
}
@Override
public void run() {
for(int i=0;i<26;i++){
synchronized (printer) {
printer.print((char)('A'+i));
printer.notify();
}
if(i== 25){
return;
}
synchronized (printer) {
try {
printer.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public Printer getPrinter() {
return printer;
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
package test;
public class Printer {
public void print(Object obj){
System.out.print(obj.toString());
}
}
package test;
public class TestPrint {
public static void main(String[] args) {
Printer printer = new Printer();
Thread numThread = new Thread(new NumThread(printer));
Thread charThread = new Thread(new CharThread(printer));
numThread.start();
charThread.start();
}
}
//下面说明
两个线程循环打印数据,属于线程间通信,因此如果要线程间通信,就需要两个线程执行时获取同一把锁(这里为Printer对象)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询