多个线程访问共享对象和数据有很多方式,但是可以分为两大类: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.out.println(++num + "==add"); } }; Thread t1 = new Thread(r); Thread t2 = new Thread(r); Thread t3 = new Thread(r); t1.start(); t2.start(); t3.start(); }
对于多线程代码不同的情况来说:
1)将需要共享的对象或者数据放入另一个对象中,这个对象对外提供对其操作的方法,由不同的线程调用。
class Number { int num = 100; public int add() { return ++num; } public int del() { return --num; } }
Runnable对象中使用同一个Number对象
public static void main(String[] args) { final Number num = new Number(); Runnable rAdd = new Runnable() { @Override public synchronized void run() { System.out.println(num.add() + "==add"); } }; Runnable rDel = new Runnable() { @Override public synchronized void run() { System.out.println(num.del() + "==del"); } }; Thread t1 = new Thread(rAdd); Thread t2 = new Thread(rDel); Thread t3 = new Thread(rAdd); t1.start(); t2.start(); t3.start(); }
2)将Runnable写成内部类的形式,然后将需要共享的对象和数据写成外部类的成员变量。
class Number{ int num = 100; Runnable r_add = new Runnable() { @Override public synchronized void run() { System.out.println(++num+"==add"); } }; Runnable r_del = new Runnable() { @Override public synchronized void run() { System.out.println(--num+"==del"); } }; }
然后通过调用Number对象中的内部类对象来实现。
public static void main(String[] args) { Number n = new Number(); Thread t1 = new Thread(n.r_add); Thread t2 = new Thread(n.r_del); t1.start(); t2.start(); }
------------------------------------------------------------------------------
还有一种方法简单粗暴,就是把需要共享的对象和数据用static修饰。
原文:http://my.oschina.net/lunqi/blog/477625