简单的总结一下多线程共享数据的方式。其实,最重要的,是一个思想,一个面向对象的编程思想的建立。
说两点:
一、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。
/**
* 卖票处理
* @author yang
*/
public class SellTicket {
//卖票系统,多个窗口的处理逻辑是相同的
public static void main(String[] args) {
Ticket t = new Ticket();
new Thread(t).start();
new Thread(t).start();
}
}
/**
* 将属性和处理逻辑,封装在一个类中
* @author yang
*/
class Ticket implements Runnable{
private int ticket = 10;
public synchronized void run() {
while(ticket>0){
ticket--;
System.out.println("当前票数为:"+ticket);
}
}
}
打印结果:
当前票数为:9
当前票数为:8
当前票数为:7
当前票数为:6
当前票数为:5
当前票数为:4
当前票数为:3
当前票数为:2
当前票数为:1
当前票数为:0
二,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计2个线程。一个线程对j增加1,另外一个线程对j减1,银行存取款。
/**
* 一个线程加1,一个线程减1
* @author yang
*/
public class MultiThreadShareData {
public static void main(String[] args) {
ShareData data = new ShareData();
new Thread(new MyRunnable1(data)).start();
new Thread(new MyRunnable2(data)).start();
}
}
class MyRunnable1 implements Runnable {
private ShareData data;
public MyRunnable1(ShareData data) {
this.data = data;
}
public void run() {
data.decrement();
}
}
class MyRunnable2 implements Runnable {
private ShareData data;
public MyRunnable2(ShareData data) {
this.data = data;
}
public void run() {
data.increment();
}
}
class ShareData {
private int j = 10;
public synchronized void increment() {
j++;
System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);
}
public synchronized void decrement() {
j--;
System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);
}
}
关键还是思想:将共享数据和处理逻辑,封装在一个类中。业务逻辑(即加1的线程和减1的线程操作)在执行时,直接调用该类中的处理逻辑。这样做,更符合面向对象,更易于维护。
总结一下,对于多线程间对共享变量的操作,还是要实现互斥,使得对该共享变量的操作,实现原子性即可。
好了,简洁总结,深刻理解。有不对的地方,欢迎指出,在此谢过。
那时年少轻狂,把喜欢当做筹码,才敢肆无忌惮的任性。
----那时年少轻狂