1. 程式人生 > >Java多執行緒與併發應用-(6)-多個執行緒之間共享物件和資料的方式

Java多執行緒與併發應用-(6)-多個執行緒之間共享物件和資料的方式

此內容來自張孝祥老師的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();
		}
	}
	
}