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); } }