多线程和并发库应用七-线程间数据共享2
2018-01-06 20:39
567 查看
上两篇讲到了数据共享的方式本篇主要一个小题目来巩固一下
假设有4个线程两个要对j加1 ,两个要对j 减1
两种方式实现线程的数据共享
1. 将共享数据封装在另一个对象中,然后将这个对象逐一传递给各个Runable 对象。每个线程对共享数据的操作也分配到那个对象中去完成。这样容易实现针对该数据进行的各个操作的互斥和通信。
2.将各个runnable 对象作为内部类 对象作为外部成员变量
文章地址:http://www.haha174.top/article/details/253024
项目源码:https://github.com/haha174/thread-learning.git
假设有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
相关文章推荐
- java多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- 多线程和并发库应用五-线程间数据共享
- Java多线程与并发应用-(6)-多个线程之间共享对象和数据的方式
- 多线程并发库高级应用 之 线程范围内共享数据
- 多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- 多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- 多线程并发库高级应用 之 线程范围内共享数据
- 多线程并发库高级应用 之 线程范围内共享数据
- java并发-多线程之多个线程之间共享数据(6)
- Java多线程与并发库高级应用之线程数据交换Exchanger
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- java多线程与线程并发四:线程范围内的共享数据
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类
- 【Java多线程与并发库】7.多个线程之间共享数据的方式探讨
- 【Java多线程与并发库】06 多个线程之间共享数据的方式探讨
- 【Java多线程与并发库】7.多个线程之间共享数据的方式探讨
- java多线程与线程并发五:多个线程访问共享对象和数据的方式
- java多线程并发库高级应用 之 线程范围内共享数据
- Java高并发编程:多个线程之间共享数据的方式探讨
- Java高并发编程:线程范围内共享数据