0
点赞
收藏
分享

微信扫一扫

多线程数据共享分析

李雨喵 2022-08-18 阅读 78


如果多个线程的代码是一样的

package thread.multithread.tradition;

import java.util.Random;

public class MultiThreadInAndDe {

static ShareData sd=new ShareData();

public static void main(String[] args) {
Store store=new Store();
for(int i=0;i<10;i++){
new Thread(store).start();

}
}


}


class Store implements Runnable{

int count=100;
public Store(int k){
count=k;
}
public Store(){

}
@Override
public void run() {
decrement();

}
private synchronized void decrement(){
count--;
System.out.println(Thread.currentThread().getName()+" count"+count);
}

}


多个线程的逻辑不一样

    首先把要操作的对象封装成一个对象,然后对外提供不同的处理逻辑

     不使用内部类

     把不同的逻辑写到不同的实现了runnable的的类的run方法中,再把之前的操作对象作为参数传递进不同的实现了runnable的的类中(构造方法,set方法俱可)

<pre name="code" class="java">public class MultiThreadInAndDe {

public static void main(String[] args) {

ShareData sd = new ShareData();
ADD add = new ADD(sd);
for (int i = 0; i < 10; i++) {
new Thread(add).start();
}
SUB sub = new SUB(sd);
for (int i = 0; i < 10; i++) {
new Thread(sub).start();
}
}

}

class ShareData {
static int i = 100;

public synchronized void increment() {
i++;
System.out.println(i);
}

public synchronized void decrement() {
i--;
System.out.println(i);
}
}

class ADD implements Runnable {
ShareData count;

public ADD(ShareData k) {
count = k;
}

@Override
public void run() {
count.decrement();
}
}

class SUB implements Runnable {
ShareData count;

public SUB(ShareData k) {
count = k;
}

@Override
public void run() {
count.decrement();

}

}





     使用内部类

         

final ShareData sd=new ShareData();
for(int i=0;i<10;i++)
new Thread(new Runnable() {

@Override
public void run() {
sd.decrement();

}
}).start();

for(int i=0;i<10;i++)
new Thread(new Runnable() {

@Override
public void run() {
sd.increment();

}
}).start();

当然,ShareData sd=new ShareData();也可以改成外部类的成员变量

      






举报

相关推荐

0 条评论