1、循环打印-version1
class XinTask{
private final static Object lock = new Object();
private int flag = 0;
private int time;
public XinTask(int time) {
this.time = time;
}
public void print(int signal,int printTarget) {
for (int i = 0; i < time; i++) {
synchronized (lock){
while (flag != signal){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(flag + " printTarget == flag ? " + (printTarget == flag));
flag = (flag + 1) % 3;
lock.notifyAll();
}
}
}
}
public class Main {
static private XinTask xinTask = new XinTask(10000);
public static void main(String[] args) {
new Thread(()->{
xinTask.print(0,0);
},"task0").start();
new Thread(()->{
xinTask.print(1,1);
},"task1").start();
new Thread(()->{
xinTask.print(2,2);
},"task2").start();
}
}
2、循环打印-version2
class XinTask {
private int flag = 0;
private int time;
int queueNumber;
public XinTask(int queueNumber) {
this.queueNumber = queueNumber;
time = 1;
}
public XinTask(int time, int queueNumber) {
this.time = time;
this.queueNumber = queueNumber;
}
public void print(String targetStr, int signal) {
for (int i = 0; i < time; i++) {
synchronized (this) {
while (flag != signal) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("targetStr is " + targetStr + " ,flag is " + flag + " , signal == flag ? " + (signal == flag));
flag = (flag + 1) % queueNumber;
this.notifyAll();
}
}
}
}
public class Main {
static final int queueNumber = 3;
private static final int time = 10000;
static private XinTask xinTask = new XinTask(time, queueNumber);
public static void main(String[] args) {
new Thread(() -> {
xinTask.print("a", 0);
}, "task0").start();
new Thread(() -> {
xinTask.print("b", 1);
}, "task1").start();
new Thread(() -> {
xinTask.print("c", 2);
}, "task2").start();
}
@Test
public void test() {
ArrayList<String> list = new ArrayList<>(queueNumber);
list.add("a");
list.add("b");
list.add("c");
printTargetStringByThreads(list);
}
private void printTargetStringByThreads(ArrayList<String> list) {
ArrayList<Thread> threads = new ArrayList<>(queueNumber);
for (int i = 0; i < queueNumber; i++) {
int order = i;
Thread t = new Thread(() -> {
xinTask.print(list.get(order) + "", order);
}, "task" + order);
t.start();
threads.add(t);
}
threads.forEach((t) -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
3、最终版本
import org.junit.Test;
import java.util.ArrayList;
class XinTask {
private int flag = 0;
private int time;
public XinTask() {
time = 1;
}
public XinTask(int time) {
this.time = time;
}
public void print(String targetStr, int signal, int queueNumber) {
for (int i = 0; i < time; i++) {
synchronized (this) {
while (flag != signal) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("targetStr is " + targetStr);
flag = (flag + 1) % queueNumber;
this.notifyAll();
}
}
}
public void printTargetStringByThreadsWithJoin(ArrayList<String> list) {
if (list == null) return;
ArrayList<Thread> threads = new ArrayList<>(list.size());
for (int i = 0; i < list.size(); i++) {
int order = i;
Thread t = new Thread(() -> {
print(list.get(order), order, list.size());
}, "task" + order);
t.start();
threads.add(t);
}
threads.forEach((t) -> {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
public class Main {
private static final int time = 10000;
static private XinTask xinTask = new XinTask(time);
public static void main(String[] args) {
new Thread(() -> {
xinTask.print("a", 0, 3);
}, "task0").start();
new Thread(() -> {
xinTask.print("b", 1, 3);
}, "task1").start();
new Thread(() -> {
xinTask.print("c", 2, 3);
}, "task2").start();
}
@Test
public void test() {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
XinTask xinTask = new XinTask(10000);
xinTask.printTargetStringByThreadsWithJoin(list);
}
}