您的位置:首页 > 其它

多线程和并发库应用七-线程间数据共享2

2018-01-06 20:39 567 查看
上两篇讲到了数据共享的方式本篇主要一个小题目来巩固一下

假设有4个线程两个要对j加1 ,两个要对j 减1

两种方式实现线程的数据共享

1. 将共享数据封装在另一个对象中,然后将这个对象逐一传递给各个Runable 对象。每个线程对共享数据的操作也分配到那个对象中去完成。这样容易实现针对该数据进行的各个操作的互斥和通信。

public class ThreadShareData {
public static void  main(String[] args ){
ShareData1 sd1=new ShareData1();
new Thread(new Runnable1(sd1)).start();
new Thread(new Runnable1(sd1)).start();
new Thread(new Runnable2(sd1)).start();
new Thread(new Runnable2(sd1)).start();
}
}
class Runnable1 implements  Runnable{
private ShareData1 sd1;

public Runnable1(ShareData1 sd1){
this.sd1=sd1;
}
public void run() {
while (true){
try {
Thread.sleep(1000);
sd1.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Runnable2 implements  Runnable{
private ShareData1 sd1;

public Runnable2(ShareData1 sd1){
this.sd1=sd1;
}
public void run() {
while (true){
try {
Thread.sleep(1000);
sd1.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
class ShareData1{
private int j=0;
public void increment(){
System.out.print(j+" ");
j++;
System.out.println(" add after "+j);
}
public void decrement(){
System.out.print(j+" ");
j--;
System.out.println(" decre after "+j);
}

}


2.将各个runnable 对象作为内部类 对象作为外部成员变量

public class ThreadShareData2 {
public static void  main(String[] args ){

final ShareData1 sd1=new ShareData1();
new Thread(new Runnable(){

public void run() {
while (true){
try {
Thread.sleep(1000);
sd1.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}            }
}).start();
new Thread(new Runnable(){

public void run() {
while (true){
try {
Thread.sleep(1000);
sd1.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}            }
}).start();
new Thread(new Runnable(){

public void run() {
while (true){
try {
Thread.sleep(1000);
sd1.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}            }
}).start();
new Thread(new Runnable(){

public void run() {
while (true){
try {
Thread.sleep(1000);
sd1.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}            }
}).start();

}
}

class ShareData1 {
private int j=0;
public synchronized void increment(){
System.out.print(j+" ");
j++;
System.out.println(" add after "+j);
}
public synchronized  void decrement(){
System.out.print(j+" ");
j--;
System.out.println(" decre after "+j);
}

public void run() {

}
}


文章地址:http://www.haha174.top/article/details/253024

项目源码:https://github.com/haha174/thread-learning.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息