多线程篇五:多个线程访问共享对象和数据的方式

1.多个线程共享一个变量实现方式1 :  将共享数据封装当另外一个对象中,然后将这个对象传递给各个Runnable对象

package com.test.shareData;

/**
 * 多个线程共享一个变量:1.将共享数据封装当另外一个对象中,然后将这个对象传递给各个Runnable对象
 * @author Administrator
 *
 */
public class MultiThreadShareData {

    public static void main(String[] args) {
        ShareData data1=new ShareData();
        new Thread(new MyRunnable1(data1)).start();
        new Thread(new MyRunnable2(data1)).start();
        System.out.println("mian: "+data1.getCount());
    }

}

class MyRunnable1 implements Runnable{
    private ShareData data1;
    public MyRunnable1(ShareData data){
        this.data1=data;
    }
    @Override
    public void run() {
        data1.increment();
        System.out.println("MyRunnable1:"+data1.getCount());
    }
}

class MyRunnable2 implements Runnable{
    private ShareData data2;
    public MyRunnable2(ShareData data){
        this.data2=data;
    }
    @Override
    public void run() {
        data2.increment();
        System.out.println("MyRunnable2:"+data2.getCount());
    }
}

 class ShareData{
    private int count=100;
    void increment(){
        count++;
    }

    public int getCount() {
        return count;
    }
}

2.多个线程共享一个变量实现方式2 : 将多个Runnable对象作为一个类的内部了,将共享变量作为外部类的成员变量

package com.test.shareData;

/**
 * 多个线程共享一个变量:2.将多个Runnable对象作为一个类的内部了,将共享变量作为外部类的成员变量
 * @author Administrator
 *
 */
public class MultiThreadShareData1 {
    static ShareData1 data1=new ShareData1();
    public static void main(String[] args) {
        new Thread(new Runnable(){
            @Override
            public void run() {
                data1.increment();
            }
        }).start();
        new Thread(new Runnable(){
            @Override
            public void run() {
                data1.decrement();
            }
        }).start();
        System.out.println("mian: "+data1.getCount());
        //mian: 102
    }
}

 class ShareData1{
    private int count=100;
    void increment(){
        count++;
    }
    void decrement(){
        count--;
    }

    public int getCount() {
        return count;
    }
}

3.测试题 : 4个线程,其中两个每次对j加1,另外两个每次对j减1

package com.test.shareData;

/**
 * 4个线程,其中两个每次对j加1,另外两个每次对j减1
 * @author Administrator
 *
 */
public class MultiThreadShareDataTest {
    private int j;

    public static void main(String[] args) {
        MultiThreadShareDataTest test=new MultiThreadShareDataTest();
        IncTest in =test.new IncTest();
        DecTest de =test.new DecTest();
        for(int i=0;i<2;i++){
            Thread t1=new Thread(in);
            t1.start();

            t1=new Thread(de);
            t1.start();
        }
    }

    private synchronized void inc(){
        j++;
        System.out.println("Current Thread :"+Thread.currentThread().getName()+" j:"+j);
    }

    private synchronized void dec(){
        j--;
        System.out.println("Current Thread :"+Thread.currentThread().getName()+" j:"+j);
    }

    class IncTest implements Runnable{
            @Override
            public void run() {
                for(int i=0;i<100;i++){
                    inc();
                }
            }
    }

    class DecTest implements Runnable{
            @Override
            public void run() {
                for(int i=0;i<100;i++){
                    dec();
                }
            }
    }
}

时间: 2024-10-13 03:05:14

多线程篇五:多个线程访问共享对象和数据的方式的相关文章

多个线程访问共享对象和数据的方式

多个线程访问共享对象和数据的方式有两种情况:1.每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享.2.每个线程执行的代码不同,例如:设计四个线程,其中两个线程每次对j增加1,另外两个线程每次对j减少1. a.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个对象中有共享数据.卖票就可以这样做,每个窗口都在做卖票任务,卖的票都是同一个数据(点击查看具体案例). b.如果每个线程执行的代码不同,就需要使用不同的Runnable对象,有两种

java多线程学习-多个线程访问对象共享数据的方式

public class MulitThreadShareData { public static void main(String[] args) { final ShareData1 data1 = new ShareData1(); new Thread(new Runnable() { public void run() { data1.increment(); } }).start(); new Thread(new Runnable() { public void run() { d

多个线程访问共享对象和数据

多个线程访问共享对象和数据有很多方式,但是可以分为两大类:1.多线程执行代码相同的.2.多线程执行代码不同的 对于多线程执行代码相同的情况来说: 1)使用同一个Runnable对象,在new Thread的时候放入相同的这个对象 public static void main(String[] args) { Runnable r = new Runnable() { int num = 100; @Override public synchronized void run() { System

多线程访问共享对象和数据的方式

在多线程访问共享对象和数据时候大致可以分为两大类. 1:如果每个线程执行的代码相同,可以使用同一个runnable对象,这个runnable对象中有那个共享对象.如:买票系统. 1 public class MulteThreadlShareData { 2 public static void main(String[] args) { 3 ShareData shareData = new ShareData(); 4 new Thread(shareData).start(); 5 new

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

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

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

多线程(五)、同步访问对象,循环打印1234

class Program12 { static object obj = new object(); static int lastNum = 4; static void WriteNum(object i) { //lock (obj) //{ //Console.Write(i); //输出:1234 不加lock是无序的输出 2134 1324 等 //} //循环写入10次 1234 for (int k = 0; k < 10; k++) { lock (obj) { if ((i

多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable对象之间的数据共享:            将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象.每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个

第九篇:进程与线程

一.paramiko模块 二.ssh登录过程和上传下载 三.进程和线程简绍 四.多线程.多线程实例 五.守护线程 六.线程锁 七.递归锁 八.信号量 九.线程间通信event 十.queue消息队列 十一.进程Queue数据传递 十二.pipe 管道通信 十三.进程池和回调函数 原文地址:https://www.cnblogs.com/hanfuming/p/8358448.html