Java多執行緒與併發應用-(6)-多個執行緒之間共享物件和資料的方式
阿新 • • 發佈:2019-02-09
此內容來自張孝祥老師的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();
}
}
}