此內容來自張孝祥老師的java多線程與併發庫高級應用
如果多個線程執行的代碼相同,可以使用同一個Runnable對象,這個Runnable對象中有那個共享數據。
如果多個線程執行的代碼不同,這時候需要用不同的Runnable對象。將共享對象封裝在另一個對象中,然後將這個對象逐一傳給各個Runnable對象。每個線程對共享數據的操作方法也分配到那個對象身上去完成,這樣容易實現針對該對象進行各個操作的互斥和通信。
總之,要同步互斥的幾段代碼最好分別放在幾個獨立的方法中,這些方法再放在同一個類型,將這個類的實例交給Runnable處理,這樣容易實現他們之間的同步互斥和通信
實現代碼:
public class Demo2 {
/**
* @param args
*/
public static void main(String[] args) {
MyAddRun addRun=new MyAddRun();
MySubRun subRun=new MySubRun();
new Thread(addRun,"add--1111----- ").start();
new Thread(addRun,"add--2222----- ").start();
new Thread(subRun,"sub--3333----- ").start();
new Thread(subRun,"sub--4444----- ").start();
}
}
class Calculate
{
private static int i;
public static synchronized void addOne()
{
i++;
System.out.println(Thread.currentThread().getName()+ i);
}
public static synchronized void subOne()
{
i--;
System.out.println(Thread.currentThread().getName()+ i);
}
}
class MyAddRun implements Runnable
{
@Override
public void run() {
for(int j=0;j<100;j++)
{
Calculate.addOne();
}
}
}
class MySubRun implements Runnable
{
@Override
public void run() {
for(int j=0;j<100;j++)
{
Calculate.subOne();
}
}
}