public class ThreadScopeMultiShareData {
/**
* 多线程之间的共享数据的方式
*/
/*
* 如果每个线程执行的代码一样,可以使用同一个runnable对象,这个共享数据就可以放在runnable中,例如卖票系统
* 如下例
*/
// public static void main(String[] args) {
//
// Ticket ticket = new Ticket();
// new Thread(ticket).start();
// new Thread(ticket).start();
//
// }
//
//}
// class Ticket implements Runnable{
//
// private int ticketNum = 100;
// public void run() {
//
// while(true){
// ticketNum --;
// System.out.println("the rest of ticket num is : " + ticketNum);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// if(ticketNum<1){
// break;
// }
// }
//
//
// }
/*
* 如果每个线程执行的代码不一样,比如一个(run方法)要求加上1,一个(run方法)要求减去1
* 这就要有两个run方法,也就是有两个Runnable
* 如下例
*/
// public static void main(String[] args){
// final NumTest numTest = new NumTest();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// numTest.increment();
//
// }
// }).start();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// numTest.decrement();
// }
// }).start();
// }
// }
//
// class NumTest{
// private int num = 6;
// public void increment(){
// while(true){
// num++;
// System.out.println(num);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
// public void decrement(){
// while(true){
// num--;
// System.out.println(num);
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
//// TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
/*
* 上面的例子是把需求体现了,但是有些复杂,优化后的实例如下
* 这就是实现了把共享数据num及其方法封装在另外的一个对象NumTest中,
* 然后把这个对象逐一传递给各个runnable对象,
* 这样的好处是容易实现对该数据进行各个数据操作之间的互斥和通信
*/
// public static void main(String[] args) {
// final NumTest numTest = new NumTest();
// new Thread(new IncrementRunnable(numTest)).start();
// new Thread(new DecrementRunnable(numTest)).start();
// }
//}
// class IncrementRunnable implements Runnable{
// private NumTest numTest;
// public IncrementRunnable(NumTest numTest) {
// this.numTest = numTest;
// }
// public void run() {
// numTest.increment();
// }
// }
// class DecrementRunnable implements Runnable{
// private NumTest numTest;
// public DecrementRunnable(NumTest numTest){
// this.numTest = numTest;
// }
// public void run() {
// numTest.decrement();
// }
// }
// class NumTest{
// private int num = 6;
// public void increment(){
// num ++;
// System.out.println(num);
// }
// public void decrement(){
// num --;
// System.out.println(num);
// }
// }
}
/*
* 将runnable对象作为一个类的内部类,共享数据作为这个外部的类的成员变量,
* 每个线程对共享数据的操作方法也分配给外部类,
* 作为外部类的各个runnable对象调用调用外部类的这些方法
* 这也能很好的是想互斥和通信
* (这和上例的第一种情况几乎相似,就是成员变量和局部变量的区别)
*/
//java提供Atomic类能帮助我们解决一些多线程共享数据的问题,详情查看文档