多线程基础案例
1.单纯从两个线程交替的角度考虑。
public class testThread {
public static void main(String[] args) {
PrintNum printNum = new PrintNum();
new Thread(() -> {
printNum.printNum();
}, "线程1").start();
new Thread(() -> {
printNum.printNum();
}, "线程2").start();
}
}
class PrintNum {
int number = 1;
Lock lock = new ReentrantLock();
Condition c = lock.newCondition();
public void printNum() {
while (number <= 100) {
lock.lock();
try {
c.signal();
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
c.await();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
2.从一个线程打印奇数,一个线程打印偶数的角度考虑。
public class testThread {
public static void main(String[] args) {
PrintNum printNum = new PrintNum1();
new Thread(() -> {
printNum.printSingle();
}, "线程1(单)").start();
new Thread(() -> {
printNum.printDouble();
}, "线程2(双)").start();
}
}
class PrintNum {
int number = 1;
Lock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();
public void printSingle() {
while (number < 100) {
lock.lock();
try {
while (number%2 != 1) {
c1.await();
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public void printDouble() {
while (number < 100) {
lock.lock();
try {
while (number%2 != 0) {
c2.await();
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
c1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
版权声明:本文为wwwhcs原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。