问题:使用多线程对j进行两次++和两次--操作
1.将数据以及对数据的操作封装成一个类,然后再主线程中初始化,在创建多线程来对数据进行操作。
package Thread;
public class MultiThreadShareDataMethod1 {
public static void main(String[] args) {
ShareData sData = new ShareData();
for(int i = 0; i<2; i++)
{
new Thread(new Runnable() {
@Override
public void run() {
sData.Increase();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
sData.Decrease();
}
}).start();
}
//打印出来的不是最后的j值,因为四个线程和主线程是一起运行的,执行输出的时候,其他的线程不一定运行完了
//System.out.println("输出最后的j="+sData.Get());
}
static class ShareData{
private int j = 0;
//synchronized这个关键字容易忘掉,
public synchronized void Increase() {
j++;
System.out.println("j++后的值为:"+j);
}
public synchronized void Decrease() {
j--;
System.out.println("j--后的值为:"+j);
}
public int Get() {
return j;
}
}
}
2.将数据单独声明在外部方法中,创建两个内部继承Runnable接口的类来共享主方法中的数据j,一个类在run中++,一个类在run 中--,最后在主线程中创建Thread并传入对象。
package Thread;
public class MultiThreaedShareDataMethod2 {
private static int j = 0;//共享的数据
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new ShareDataInc()).start();
new Thread(new ShareDataDec()).start();
}
}
static class ShareDataInc implements Runnable{
@Override
public void run() {
Increase();
}
public synchronized void Increase() {
j++;
System.out.println("j++后的值:"+j);
}
}
static class ShareDataDec implements Runnable{
@Override
public void run() {
Decrease();//不要在run方法里面加加或减减,因为多线程运行的时候可能会出现计算上的错误
//最好是单独写出来一个synchronized的方法来专门进行加减操作
}
public synchronized void Decrease() {
j--;
System.out.println("j--后的值:"+j);
}
}
}