java线程之间传递数据库_多线程之间共享数据的实现

1:

如果每个线程执行的代码相同,可以使用同一个Runnable对象,然后将共享的数据放在Runnable里面,来实现数据的共享。 例如买票系统...

package com.cn.gbx;

import java.util.Date;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;

public class TestThread {

public static void main(String[] args) {

//共享数据放在了Count里面

Count count = new Count();

new Thread(count).start();

new Thread(count).start();

}

}

class Count implements Runnable{

private int count = 10;

//加互斥锁,来时实现同步

private synchronized void decrement() {

count--;

System.out.println(Thread.currentThread().getName() + " : " + count);

}

@Override

public void run() {

while (true) {

decrement();

}

}

}

2: 如果每个线程执行的代码不同, 那么就需要不同的Runnable对象,有两种方式事项这些Runnbale对象之间的数据共享

a: 将共享数据封装在另一个对象中,然后实现不同的操作,然后将这个新对象传递给Runnable对象,每个线程对共享数据的操作也就相应的分配到了那个对象身上去完成。这样就能够实现对该数据的各种操作的互斥与通信

package com.cn.gbx;

import java.util.Date;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;

public class TestThread {

public static void main(String[] args) {

ShareData count = new ShareData();

new Thread(new CountDec(count)).start();

new Thread(new CountInc(count)).start();

}

}

//将共享数据封装在另一个对象里面

class ShareData {

private int count = 100;

public synchronized void decrement() {

count--;

System.out.println(Thread.currentThread().getName() + " :" + count);

}

public synchronized void increment() {

count++;

System.out.println(Thread.currentThread().getName() + " :" + count);

}

}

//然后将新对象放入Runnable对象

class CountDec implements Runnable {

private ShareData data = null;

public CountDec(ShareData data) {

this.data = data;

}

@Override

public void run() {

while (true) {

data.decrement();

}

}

}

class CountInc implements Runnable {

private ShareData data = null;

public CountInc(ShareData data) {

this.data = data;

}

@Override

public void run() {

while (true) {

data.increment();

}

}

}

b: 将这些Runnbale对象作为某一个类中的内部类,共享数据作为外部类的成员变量,每个线程对共享数据的操作也就分配给了外部类,以便实现共享数据的各种操作的互斥通信。

package com.cn.gbx;

import java.util.Date;

import java.util.Random;

import java.util.Timer;

import java.util.TimerTask;

public class TestThread {

//将共享数据作为外部类的成员变量

final private static ShareData data = new ShareData();

public static void main(String[] args) {

//Runnbale内部类可以共享

new Thread(

new Runnable() {

@Override

public void run() {

while (true) {

data.decrement();

}

}

}

).start();

new Thread(

new Runnable() {

@Override

public void run() {

while (true) {

data.increment();

}

}

}

).start();

}

}

//将共享数据封装在另一个对象里面

class ShareData {

private int count = 100;

public synchronized void decrement() {

count--;

System.out.println(Thread.currentThread().getName() + " :" + count);

}

public synchronized void increment() {

count++;

System.out.println(Thread.currentThread().getName() + " :" + count);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值