线程笔记一:java线程经典题目:轮流打印
题目:构建四个线程,线程A将变量100加1,B减1。c加1,D减1,要依照A->B->C->D的顺序运行,终于数字还为100.使用多线程
代码:
PrintLetter.java
import java.lang.Thread;
class MyThread implements Runnable{
//给线程分配三个对象
private Object pre;
private Object self;
private Num num;
public MyThread(Object pre,Object self,Num num){
this.pre=pre;
this.self=self;
this.num=num;
}
public void run(){
for(int i=0;i<10;i++){
synchronized(pre){
synchronized(self){
synchronized(num){
self.done(num,Thread.currentThread().getName());
self.notify();//唤醒其它线程释放对象锁
}
}
//否则或者执行完毕后释放前一个对象锁
try{
pre.wait();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
//数字对象
class Num{
public int num=100;
public void add(){
this.num++;
}
public void resuce(){
this.num--;
}
public int get(){
return this.num;
}
}
class Object{
boolean done;//表示加或减
public Object(boolean done){
this.done=done;
}
public void done(Num num,String name){
if(this.done){
num.add();
System.out.println(""+name+" add---- one,Then num="+num.get());
}else{
num.resuce();
System.out.println(""+name+" reduce one,Then num="+num.get());
}
}
}
public class PrintLetter{
public static void main(String args[]){
//定义四个对象
Object first=new Object(true);
Object two=new Object(false);
Object three=new Object(true);
Object four=new Object(false);
Num num=new Num();
MyThread mythread1=new MyThread(four,first,num);
MyThread mythread2=new MyThread(first,two,num);
MyThread mythread3=new MyThread(two,three,num);
MyThread mythread4=new MyThread(three,four,num);
new Thread(mythread1).start();
try{
Thread.sleep(100);
}catch(Exception e){
}
new Thread(mythread2).start();
try{
Thread.sleep(100);
}catch(Exception e){
}
new Thread(mythread3).start();
try{
Thread.sleep(100);
}catch(Exception e){
}
new Thread(mythread4).start();
try{
Thread.sleep(100);
}catch(Exception e){
}
}
}
结果:
过程解析:
/* 四把锁 a b c d 线程1 临界区要获得锁d a 线程2 临界区要获得锁a b 线程3 临界区要获得锁b c 线程4 临界区要获得锁c d 运行线程1的时 因为线程1 获得了锁a,所以线程2会等待线程1释放锁a,线程2得到锁b 线程3会等待线程2是否锁b,线程4等待锁c和d. 线程1运行完临界区后,调用a.notify,释放自身锁,此时线程2被唤醒,開始运行。连锁反应 线程3线程4会的到顺序运行。此外线程1调用d.wait等待其它线程唤醒,当运行完线程4的时候 调用d.notify 又会唤醒线程1. 此过程重复,直到全部线程运行完成。线程1 2 3 4会得到顺序运行 运行1唤醒2 运行2唤醒3 运行3唤醒4 运行4唤醒1: 1-------------->2-------->3------------>4 ^ | |---------------------------------------| */
浙公网安备 33010602011771号