本題並不難,實現方式有很多種,有很多種結構。
方法一:利用內部類實現,兩個實現加減的類實現Runnable接口,然后再實現4個具體線程。
代碼:
package mystudy; public class ManyThreads { private int j; public static void main(String[] args) { // TODO Auto-generated method stub ManyThreads many = new ManyThreads(); Inc inc = many.new Inc(); Dec dec = many.new Dec(); for (int i = 0; i < 2; i++) { Thread t = new Thread(inc); t.start(); t = new Thread(dec); t.start(); } } private synchronized void inc() { j++; System.out.println(Thread.currentThread().getName() + "inc" + j); } private synchronized void dec() { j--; System.out.println(Thread.currentThread().getName() + "dec" + j); } class Inc implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { inc(); } } } class Dec implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { dec(); } } } }
第二種方式:具體加減操作寫在一個類的方法里,沒有內部類,用另外一個類去調用。
代碼:
public class ManyThreads2 { private int j = 0; public synchronized void inc() { j++; System.out.println(Thread.currentThread().getName() + "inc" + j); } public synchronized void dec() { j--; System.out.println(Thread.currentThread().getName() + "dec" + j); } }
調用:
public class MyTest { private ManyThreads2 many = new ManyThreads2(); public static void main(String[] args) { // TODO Auto-generated method stub MyTest myTest = new MyTest(); myTest.test(); } public void test() { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { many.inc(); } } }).start(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { many.dec(); } } }).start(); } } }
僅供參考。。