目录
练题1:编写程序实现,子线程循环3次,接着主线程循环5次,接着再子线程循环3次,主线程循环5次,如此反复,循环3次.
练习题2:设计四个线程,其中两个线程每次对变量i加1,另外两个线程每次对i减1.
练习题3:自己编写代码,实现生产者-消费者模型功能.内容自由发挥,只需要表达思想.
练习题4:现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
练题1:编写程序实现,子线程循环3次,接着主线程循环5次,接着再子线程循环3次,主线程循环5次,如此反复,循环3次.
第一种实现方式:使用synchronized关键字
package com.lianxi;
public class ThreadMain2 {
public static void main(String[] args) {
final ThreadFunction2 f2 = new ThreadFunction2();
// 子线程循环3次
new Thread(new Runnable(){
public void run(){
for(int i=0;i<3;i++){
f2.subFunction();
}
}
}).start();
// 主线程循环3次
for(int i=0;i<3;i++){
f2.mainFunction();
}
}
}
package com.lianxi;
// 编写功能类,实现子线程和主线程的功能
public class ThreadFunction2 {
private boolean flag = false;
// 主线程要实现的功能
public synchronized void mainFunction(){
while(!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<5;i++){
System.out.println("mainFunction"+i);
}
this.notify();
flag = false;
}
// 子线程要实现的功能
public synchronized void subFunction(){
while(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<3;i++){
System.out.println("subFunction"+i);
}
this.notify();
flag = true;
}
}
输出结果:
subFunction0
subFunction1
subFunction2
mainFunction0
mainFunction1
mainFunction2
mainFunction3
mainFunction4
subFunction0
subFunction1
subFunction2
mainFunction0
mainFunction1
mainFunction2
mainFunction3
mainFunction4
subFunction0
subFunction1
subFunction2
mainFunction0
mainFunction1
mainFunction2
mainFunction3
mainFunction4
第二种实现方式:使用 lock 锁和 Condition 接口
package com.lianxi;
public class ThreadMain {
public static void main(String[] args) {
final ThreadFunction f = new ThreadFunction();
// 子线程循环3次
new Thread(new Runnable(){
public void run(){
for(int i=0;i<3;i++){
f.subFunction();
}
}
}).start();
// 主线程循环3次
for(int i=0;i<3;i++){
f.mainFunction();
}
}
}
package com.lianxi;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// 编写功能类,实现子线程和主线程的功能
public class ThreadFunction extends Thread{
private boolean flag = false;
Lock lock = new ReentrantLock();
Condition con = lock.newCondition();
// 主线程要实现的功能
public void mainFunction(){
System.out.println("1.主线程开始"+" -- flag="+flag);
lock.lock();
try{
while(!flag){
try {
System.out.println("2.主线程等待"+" -- flag="+flag);
con.await(); // 使当前线程加入 await() 等待队列中,并释放当锁,当其他线程调用signal()会重新请求锁。与O