启动两个线程对一个数字i操作
1)其中1个线程每次对i加1
2)另1个线程每次对i减1
各运行20次,结果i的值等于初始值
1、在AddAndSub类中创建两个synchronized类,建立同步机制,分别递增和递减
2、分别创建Subtract和Add类继承Thread类,重写run方法循环AddAndSub类的两种方法进行操作
package com.lianxi.thread;
/**
* 启动两个线程对一个数字i操作
* 1)其中1个线程每次对i加1
* 2)另1个线程每次对i减1
* 各运行20次,结果i的值等于初始值。
*/
public class PrintI {
public static void main(String[] args){
AddAndSub addAndSub=new AddAndSub();
Add a=new Add(addAndSub);
Subtract s=new Subtract(addAndSub);
a.setName("加");
s.setName("减");
a.start();
s.start();
}
}
class AddAndSub{
private static int i=1;
public static void setI(int i) {
AddAndSub.i = i;
}
public static int getI() {
return i;
}
public synchronized void add(){
//System.out.println("1");
//I递增
try {
wait(1000);//等待一秒
}catch (InterruptedException e){
e.printStackTrace();
}
i++;//递增
System.out.println(i);
notifyAll();//唤醒其他线程
}
public synchronized void sub(){
//I递减
try {
wait(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
i--;
System.out.println(i);
notifyAll();
}
}
class Add extends Thread{
public AddAndSub addAndSub;
public Add(AddAndSub addAndSub){
this.addAndSub=addAndSub;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":开始递增");
for (int i=0;i<20;i++){
try{
sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
addAndSub.add();
System.out.println(Thread.currentThread().getName()+":"+AddAndSub.getI());
}
}
}
class Subtract extends Thread{
private AddAndSub addAndSub;
public Subtract(AddAndSub addAndSub){
this.addAndSub=addAndSub;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":开始递减");
for (int i=0;i<20;i++){
try{
sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
addAndSub.sub();
System.out.println(Thread.currentThread().getName()+":"+AddAndSub.getI());
}
}
}