一、如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享
public class MultiThreadShareData { public static void main(String[] args) { new Thread(new ShareData()).start(); new Thread(new ShareData()).start(); } static class ShareData implements Runnable{ private int j = 100; @Override public synchronized void run() { j--; } } }上面代码中两个线程共享数据实现对j变量的递减操作,至于上面代码中为什么要使用一个静态内部类,该类static的作用是不依赖外部类的实例创建对象。
二、如果每个线程执行的代码不同,则需要使用不同的Runnable对象来实现共享
public class MultiThreadShareData { public static void main(String[] args) { final ShareData data1 = new ShareData(); //启动第一个线程 new Thread(new Runnable() { @Override public void run() { data1.increment(); //加 } }).start(); //启动第二个线程 new Thread(new Runnable() { @Override public void run() { data1.decrement(); //减 } }).start(); } static class ShareData{ private int j = 0; public synchronized void increment(){ j++; } public synchronized void decrement(){ j--; } } }
将上面代码进修改(将数据作为外部类的成员变量,让Runnable接口操作该成员变量)如下:
public class MultiThreadShareData { public static void main(String[] args) { ShareData data1 = new ShareData(); new Thread(new MyRunnable1(data1)).start(); new Thread(new MyRunnable2(data1)).start(); } static class MyRunnable1 implements Runnable{ private ShareData data1; public MyRunnable1(ShareData data1){ this.data1 = data1; } @Override public void run() { data1.increment(); } } static class MyRunnable2 implements Runnable{ private ShareData data1; public MyRunnable2(ShareData data2){ this.data1 = data1; } @Override public void run() { data1.decrement(); } } static class ShareData{ private int j = 0; public synchronized void increment(){ j++; } public synchronized void decrement(){ j--; } } }
三、一道面试题(设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1)
/** * 设计 4 个 ( 可以是 n 个 ) 线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 */ package com.jiaocaigen.test; public class Test { // 采用 Runnable 接口方式创建的多条线程可以共享实例属性 private int i ; // 同步增加方法 private synchronized void inc(){ i ++; System. out .println(Thread.currentThread().getName()+ "--inc--" + i ); } // 同步减算方法 private synchronized void dec(){ i --; System. out .println(Thread.currentThread().getName()+ "--dec--" + i ); } // 增加线程 class Inc implements Runnable { public void run() { inc(); } } // 减算线程 class Dec implements Runnable{ public void run() { dec(); } } public static void main(String[] args) { Test t = new Test(); // 内部类的实例化 Inc inc = t. new Inc(); Dec dec = t. new Dec(); // 创建 2*n 个线程 此处 n=2 for ( int i = 0; i < 2; i++) { new Thread(inc).start(); new Thread(dec).start(); } } }