范例1:两个线程交替打印1-100之间的整数
package com.contoso;
public class MultiThreadPrinter {
public static int intValue = 1;
public static void main(String[] args) {
Printer printer = new Printer();
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (intValue <= 100) {
printer.print(intValue++);
}
}
}).start();
}
}
static class Printer {
public void print(int intValue) {
synchronized (this) {
notify(); // 唤醒另一个线程
System.out.println(Thread.currentThread().getName() + " " + intValue);
try {
// 休眠200毫秒让打印效果更具备观赏性
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
wait(); // 释放掉锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
run:
Thread-0 1
Thread-1 2
Thread-0 3
Thread-1 4
Thread-0 5
Thread-1 6
Thread-0 7
Thread-1 8
Thread-0 9
Thread-1 10
Thread-0 11
Thread-1 12
Thread-0 13
Thread-1 14
Thread-0 15
Thread-1 16
Thread-0 17
Thread-1 18
Thread-0 19
Thread-1 20
Thread-0 21
Thread-1 22
Thread-0 23
Thread-1 24
Thread-0 25
Thread-1 26
Thread-0 27
Thread-1 28
Thread-0 29
Thread-1 30
Thread-0 31
Thread-1 32
Thread-0 33
Thread-1 34
Thread-0 35
Thread-1 36
Thread-0 37
Thread-1 38
Thread-0 39
Thread-1 40
Thread-0 41
Thread-1 42
Thread-0 43
Thread-1 44
Thread-0 45
Thread-1 46
Thread-0 47
Thread-1 48
Thread-0 49
Thread-1 50
Thread-0 51
Thread-1 52
Thread-0 53
Thread-1 54
Thread-0 55
Thread-1 56
Thread-0 57
Thread-1 58
Thread-0 59
Thread-1 60
Thread-0 61
Thread-1 62
Thread-0 63
Thread-1 64
Thread-0 65
Thread-1 66
Thread-0 67
Thread-1 68
Thread-0 69
Thread-1 70
Thread-0 71
Thread-1 72
Thread-0 73
Thread-1 74
Thread-0 75
Thread-1 76
Thread-0 77
Thread-1 78
Thread-0 79
Thread-1 80
Thread-0 81
Thread-1 82
Thread-0 83
Thread-1 84
Thread-0 85
Thread-1 86
Thread-0 87
Thread-1 88
Thread-0 89
Thread-1 90
Thread-0 91
Thread-1 92
Thread-0 93
Thread-1 94
Thread-0 95
Thread-1 96
Thread-0 97
Thread-1 98
Thread-0 99
Thread-1 100
范例2:两个线程交替打印1-100之间的整数,一个线程打印奇数,另外一个线程打印偶数
package com.contoso;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MultiThreadPrinter {
private static Lock lock = new ReentrantLock();
private static Condition condition1 = lock.newCondition();
private static Condition condition2 = lock.newCondition();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 1; i <= 99; i += 2) {
lock.lock();
try {
condition2.signal();
System.out.println(Thread.currentThread().getName() + " " + i);
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
});
Thread t2 = new Thread(() -> {
for (int i = 2; i <= 100; i += 2) {
lock.lock();
try {
condition1.signal();
System.out.println(Thread.currentThread().getName() + " " + i);
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
});
t1.start();
t2.start();
}
}
run:
Thread-0 1
Thread-1 2
Thread-0 3
Thread-1 4
Thread-0 5
Thread-1 6
Thread-0 7
Thread-1 8
Thread-0 9
Thread-1 10
Thread-0 11
Thread-1 12
Thread-0 13
Thread-1 14
Thread-0 15
Thread-1 16
Thread-0 17
Thread-1 18
Thread-0 19
Thread-1 20
Thread-0 21
Thread-1 22
Thread-0 23
Thread-1 24
Thread-0 25
Thread-1 26
Thread-0 27
Thread-1 28
Thread-0 29
Thread-1 30
Thread-0 31
Thread-1 32
Thread-0 33
Thread-1 34
Thread-0 35
Thread-1 36
Thread-0 37
Thread-1 38
Thread-0 39
Thread-1 40
Thread-0 41
Thread-1 42
Thread-0 43
Thread-1 44
Thread-0 45
Thread-1 46
Thread-0 47
Thread-1 48
Thread-0 49
Thread-1 50
Thread-0 51
Thread-1 52
Thread-0 53
Thread-1 54
Thread-0 55
Thread-1 56
Thread-0 57
Thread-1 58
Thread-0 59
Thread-1 60
Thread-0 61
Thread-1 62
Thread-0 63
Thread-1 64
Thread-0 65
Thread-1 66
Thread-0 67
Thread-1 68
Thread-0 69
Thread-1 70
Thread-0 71
Thread-1 72
Thread-0 73
Thread-1 74
Thread-0 75
Thread-1 76
Thread-0 77
Thread-1 78
Thread-0 79
Thread-1 80
Thread-0 81
Thread-1 82
Thread-0 83
Thread-1 84
Thread-0 85
Thread-1 86
Thread-0 87
Thread-1 88
Thread-0 89
Thread-1 90
Thread-0 91
Thread-1 92
Thread-0 93
Thread-1 94
Thread-0 95
Thread-1 96
Thread-0 97
Thread-1 98
Thread-0 99
Thread-1 100
范例3:两个线程交替打印1-100之间的整数,一个线程打印奇数,另外一个线程打印偶数
package com.contoso;
public class MultiThreadPrinter {
private static Object obj = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 1; i <= 99; i += 2) {
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + " " + i);
try {
Thread.sleep(200);
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj.notify();
}
}
});
Thread t2 = new Thread(() -> {
for (int i = 2; i <= 100; i += 2) {
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + " " + i);
obj.notify();
try {
Thread.sleep(200);
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t1.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
}
}
run:
Thread-0 1
Thread-1 2
Thread-0 3
Thread-1 4
Thread-0 5
Thread-1 6
Thread-0 7
Thread-1 8
Thread-0 9
Thread-1 10
Thread-0 11
Thread-1 12
Thread-0 13
Thread-1 14
Thread-0 15
Thread-1 16
Thread-0 17
Thread-1 18
Thread-0 19
Thread-1 20
Thread-0 21
Thread-1 22
Thread-0 23
Thread-1 24
Thread-0 25
Thread-1 26
Thread-0 27
Thread-1 28
Thread-0 29
Thread-1 30
Thread-0 31
Thread-1 32
Thread-0 33
Thread-1 34
Thread-0 35
Thread-1 36
Thread-0 37
Thread-1 38
Thread-0 39
Thread-1 40
Thread-0 41
Thread-1 42
Thread-0 43
Thread-1 44
Thread-0 45
Thread-1 46
Thread-0 47
Thread-1 48
Thread-0 49
Thread-1 50
Thread-0 51
Thread-1 52
Thread-0 53
Thread-1 54
Thread-0 55
Thread-1 56
Thread-0 57
Thread-1 58
Thread-0 59
Thread-1 60
Thread-0 61
Thread-1 62
Thread-0 63
Thread-1 64
Thread-0 65
Thread-1 66
Thread-0 67
Thread-1 68
Thread-0 69
Thread-1 70
Thread-0 71
Thread-1 72
Thread-0 73
Thread-1 74
Thread-0 75
Thread-1 76
Thread-0 77
Thread-1 78
Thread-0 79
Thread-1 80
Thread-0 81
Thread-1 82
Thread-0 83
Thread-1 84
Thread-0 85
Thread-1 86
Thread-0 87
Thread-1 88
Thread-0 89
Thread-1 90
Thread-0 91
Thread-1 92
Thread-0 93
Thread-1 94
Thread-0 95
Thread-1 96
Thread-0 97
Thread-1 98
Thread-0 99
Thread-1 100
BUILD SUCCESSFUL (total time: 20 seconds)
范例4:3个线程交替打印1-100之间的整数
package com.contoso;
public class MultiThreadPrinter {
private static volatile int i = 1;
private static volatile int flag = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(new Printer1()).start();
new Thread(new Printer2()).start();
new Thread(new Printer3()).start();
}
static class Printer1 implements Runnable {
public void run() {
while (i <= 100) {
if (flag == 0) {
System.out.println(Thread.currentThread().getName() + " " + i);
i++;
flag = 1;
}
}
}
}
static class Printer2 implements Runnable {
public void run() {
while (i <= 100) {
if (flag == 1) {
System.out.println(Thread.currentThread().getName() + " " + i);
i++;
flag = 2;
}
}
}
}
static class Printer3 implements Runnable {
public void run() {
while (i <= 100) {
if (flag == 2) {
System.out.println(Thread.currentThread().getName() + " " + i);
i++;
flag = 0;
}
}
}
}
}
run:
Thread-0 1
Thread-1 2
Thread-2 3
Thread-0 4
Thread-1 5
Thread-2 6
Thread-0 7
Thread-1 8
Thread-2 9
Thread-0 10
Thread-1 11
Thread-2 12
Thread-0 13
Thread-1 14
Thread-2 15
Thread-0 16
Thread-1 17
Thread-2 18
Thread-0 19
Thread-1 20
Thread-2 21
Thread-0 22
Thread-1 23
Thread-2 24
Thread-0 25
Thread-1 26
Thread-2 27
Thread-0 28
Thread-1 29
Thread-2 30
Thread-0 31
Thread-1 32
Thread-2 33
Thread-0 34
Thread-1 35
Thread-2 36
Thread-0 37
Thread-1 38
Thread-2 39
Thread-0 40
Thread-1 41
Thread-2 42
Thread-0 43
Thread-1 44
Thread-2 45
Thread-0 46
Thread-1 47
Thread-2 48
Thread-0 49
Thread-1 50
Thread-2 51
Thread-0 52
Thread-1 53
Thread-2 54
Thread-0 55
Thread-1 56
Thread-2 57
Thread-0 58
Thread-1 59
Thread-2 60
Thread-0 61
Thread-1 62
Thread-2 63
Thread-0 64
Thread-1 65
Thread-2 66
Thread-0 67
Thread-1 68
Thread-2 69
Thread-0 70
Thread-1 71
Thread-2 72
Thread-0 73
Thread-1 74
Thread-2 75
Thread-0 76
Thread-1 77
Thread-2 78
Thread-0 79
Thread-1 80
Thread-2 81
Thread-0 82
Thread-1 83
Thread-2 84
Thread-0 85
Thread-1 86
Thread-2 87
Thread-0 88
Thread-1 89
Thread-2 90
Thread-0 91
Thread-1 92
Thread-2 93
Thread-0 94
Thread-1 95
Thread-2 96
Thread-0 97
Thread-1 98
Thread-2 99
Thread-0 100
BUILD SUCCESSFUL (total time: 0 seconds)
范例5:先让子线程执行3次,然后让主线程执行5次,如此往复10次
package com.contoso;
/**
*
* 先让子线程执行3次,然后让主线程执行5次,如此往复10次
*/
public class MainApp {
public static void main(String[] args) {
Printer printer = new Printer();
new Thread(new Runnable() {
public void run() {
// 子线程执行10次
for (int i = 1; i <= 10; i++) {
printer.child(i);
}
}
}
).start();
// 主线程执行10次
for (int i = 1; i <= 10; i++) {
printer.main(i);
}
}
}
class Printer {
private boolean isRunning = true;
public synchronized void child(int i) {
while (!isRunning) {
try {
this.wait(); //让子线程睡眠等待,并释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 3; j++) {
System.out.println(Thread.currentThread().getName() + " " + j + " loop of " + i);
}
isRunning = false;
this.notify(); // 唤醒主线程去执行
}
public synchronized void main(int i) {
while (isRunning) {
try {
this.wait(); //让主线程睡眠等待,并释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 5; j++) {
System.out.println(Thread.currentThread().getName() + " " + j + " loop of " + i);
}
isRunning = true;
this.notify(); // 唤醒子线程去执行
}
}
run:
Thread-0 1 loop of 1
Thread-0 2 loop of 1
Thread-0 3 loop of 1
main 1 loop of 1
main 2 loop of 1
main 3 loop of 1
main 4 loop of 1
main 5 loop of 1
Thread-0 1 loop of 2
Thread-0 2 loop of 2
Thread-0 3 loop of 2
main 1 loop of 2
main 2 loop of 2
main 3 loop of 2
main 4 loop of 2
main 5 loop of 2
Thread-0 1 loop of 3
Thread-0 2 loop of 3
Thread-0 3 loop of 3
main 1 loop of 3
main 2 loop of 3
main 3 loop of 3
main 4 loop of 3
main 5 loop of 3
Thread-0 1 loop of 4
Thread-0 2 loop of 4
Thread-0 3 loop of 4
main 1 loop of 4
main 2 loop of 4
main 3 loop of 4
main 4 loop of 4
main 5 loop of 4
Thread-0 1 loop of 5
Thread-0 2 loop of 5
Thread-0 3 loop of 5
main 1 loop of 5
main 2 loop of 5
main 3 loop of 5
main 4 loop of 5
main 5 loop of 5
Thread-0 1 loop of 6
Thread-0 2 loop of 6
Thread-0 3 loop of 6
main 1 loop of 6
main 2 loop of 6
main 3 loop of 6
main 4 loop of 6
main 5 loop of 6
Thread-0 1 loop of 7
Thread-0 2 loop of 7
Thread-0 3 loop of 7
main 1 loop of 7
main 2 loop of 7
main 3 loop of 7
main 4 loop of 7
main 5 loop of 7
Thread-0 1 loop of 8
Thread-0 2 loop of 8
Thread-0 3 loop of 8
main 1 loop of 8
main 2 loop of 8
main 3 loop of 8
main 4 loop of 8
main 5 loop of 8
Thread-0 1 loop of 9
Thread-0 2 loop of 9
Thread-0 3 loop of 9
main 1 loop of 9
main 2 loop of 9
main 3 loop of 9
main 4 loop of 9
main 5 loop of 9
Thread-0 1 loop of 10
Thread-0 2 loop of 10
Thread-0 3 loop of 10
main 1 loop of 10
main 2 loop of 10
main 3 loop of 10
main 4 loop of 10
main 5 loop of 10
BUILD SUCCESSFUL (total time: 0 seconds)