练习多线程时发现几种方式,记录一下:
第一种:加判断条件然后用++i
public class Test {
public static void main(String[] args) {
Count obj = new Count();
new Thread(() -> {
synchronized (obj) {
for (int i = 1; i <= 52; i++) {
System.out.println(i);
if (obj.getCount() == 0) {
System.out.println(++i);
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj.setCount(0);
obj.notify();
}
}
}).start();
new Thread(() -> {
synchronized (obj) {
for (int i = 'A'; i <= 'Z'; i++) {
if (obj.getCount() == 2) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println((char) i);
obj.setCount(2);
obj.notify();
}
}
}).start();
}
}
class Count {
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
第二种:和第一种大同小异,加一个i%2判断是否为零
public class PrintNum {
public static void main(String[] args) {
Count obj = new Count();
new Thread(() -> {
synchronized (obj) {
for (int i = 1; i < 53; i++) {
System.out.println(i);
if (i % 2 == 0) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj.notify();
}
}
}).start();
new Thread(() -> {
synchronized (obj) {
for (int i = 'A'; i <= 'Z'; i++) {
if (obj.getCount() != 0) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println((char) i);
obj.setCount(1);
obj.notify();
}
}
}).start();
}
}
class Count{
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
第三种:则是调用方法
class Print{
private int flag = 1;
private int count = 1;
public synchronized void printNum(){
while(flag != 1) {
//此时应该打印字母
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(2*count-1);
System.out.print(2*count);
flag = 2;
notify();
}
public synchronized void printChar(){
while(flag != 2){
//此时应该打印数字
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print((char)(count-1+'A'));
//继续前行
count++;
flag = 1;
notify();
}
}
public class Test{
public static void main(String[] args) {
Print print = new Print();
new Thread(()->{
for(int i = 0;i<26;i++){
print.printNum();
}
}).start();
new Thread(()->{
for(int i = 0;i<26;i++){
print.printChar();
}
}).start();
}
}
第三种方法来自main--的博客