7.多个线程之间共享数据的方式探讨-JDK5多线程

 1 /**
 2  * 多个线程之间共享数据的方式探讨
 3  * @author LiTaiQing
 4  *
 5  * *************************************************
 6  * 如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有
 7  * 如下两种方式来实现这些Runnble对象之间的数据共享:
 8  *         1.将共享数据封装在另外一个对象中,然后将这个对象逐一传递给
 9  * 各个Runnble对象。每个线程对共享数据的操作方法也分配到那个对象身
10  * 上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信。
11  *         2.将这些Runnable对象作为某一个类中的内部类,共享数据作为
12  * 这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,
13  * 以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnble
14  * 对象调用外部类的这些方法。
15  *         上面两种方式的组合:将共享数据封装在另一个对象中,每个线程对
16  * 共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的
17  * 成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的
18  * 成员内部类或局部内部类。
19  *         总之,要同步互斥的极短代码最好是分别放在几个独立的方法中,这些
20  * 方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信。
21  * *************************************************
22  *
23  */
24 public class MultiThreadShareData {
25
26     private static ShareData1 data1 = new ShareData1();
27
28     public static void main(String[] args) {
29
30         final ShareData1 data2 = new ShareData1();
31         new Thread(new MyRunnable1(data1)).start();
32         new Thread(new MyRunnable1(data2)).start();
33
34         final ShareData1 data1 = new ShareData1();
35         new Thread(new Runnable(){
36             @Override
37             public void run() {
38                 data1.decrement();
39             }
40         }).start();
41         new Thread(new Runnable(){
42             @Override
43             public void run() {
44                 data1.increment();
45             }
46         }).start();
47     }
48
49
50 }
51
52 class MyRunnable1 implements Runnable{
53
54     private ShareData1 data1;
55
56     public MyRunnable1(ShareData1 data1){
57         this.data1 = data1;
58     }
59
60     @Override
61     public void run() {
62         data1.decrement();
63     }
64 }
65
66 class MyRunnable2 implements Runnable{
67
68     private ShareData1 data1;
69
70     public MyRunnable2(ShareData1 data1){
71         this.data1 = data1;
72     }
73
74     @Override
75     public void run() {
76         data1.increment();
77     }
78 }
79
80 class ShareData1 /*implements Runnable*/{
81
82     private int count = 100;
83
84     private int j = 0;
85     public synchronized void increment(){
86         j++;
87     }
88     public synchronized void decrement(){
89         j--;
90     }
91 //    @Override
92 //    public void run() {
93 //        while(true){
94 //            count--;
95 //        }
96 //    }
97
98 }
时间: 2024-11-04 13:05:39

7.多个线程之间共享数据的方式探讨-JDK5多线程的相关文章

Android多线程研究(5)——线程之间共享数据

一.如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享 public class MultiThreadShareData { public static void main(String[] args) { new Thread(new ShareData()).start(); new Thread(new ShareData()).start(); } static class ShareData implements Runnable{ private int j

JAVA 并发编程-多个线程之间共享数据(六)

多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程.其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款 有两种方法来解决此类问题: 将共享数据封装成另外一个对象,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上完成,这样容易实现针对

多个Activity之间共享数据的方式

现在要做一个项目,多个Activity之间要共享数据,所以要考虑共享数据的方式. 其实有如下5种方式: 1.基于消息的通信机制  Intent ---bundle ,extra 数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用. 2. 利用static静态数据,public static成员变量: 3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Pro

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

如何在两个线程之间共享数据

总 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程.其中两个线程每次对j增加1,另外两个线程对j每次减1,银行存取款 每个线程执行的代码相同,可以使用同一个Runnable对象 public class RunnalbleTest2 implements Runnable { private int threadC

多个线程之间共享数据,(探究)一下十一的车票是怎么卖的

十月一到了,大家有没有抢到回家的车票.笔者有事退了回家的卧铺票,今年十一就不回家了.算下来有8个多月没有回家了,混沌之余想想抢票是怎么回事吧.为什么会有许多的抢票软件,还有12306发售的,还有售票窗口发售的.就不会卖重吗?题设来了:现在剩下1000张票了,有的地方在买票.有的还像笔者一样退了票.其实归根结底,我们操作的都是12306的共享数据那1000张票.在这里不得不讲解一下,一个关键的地方: synchronized 关键字,代表这个方法加锁 也就是说当线程运行到这个方法的时候,就开始检查

多个线程之间共享数据

public class ThreadDemo4 { static ShareData data=new ShareData(); public static void main(String[] args) { new Thread(new Myrunnable1(data)).start(); new Thread(new Myrunnable2(data)).start(); } } class Myrunnable1 implements Runnable{ int i=50; priv

Java多个线程之间处理共享数据的方式

题目要求: 有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现? 分析: x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到"窗口买票问题",但是卖票只是单纯的减. 所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题. 如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之

多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量. 1.下图和辅助代码解释ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据. 2.每个线程调用全局ThreadLocal