不同多執行緒建立方式下,售票的安全用例

2021-09-24 01:44:12 字數 1881 閱讀 9948

@test

public void runnablesale()

try catch (interruptedexception e)

}class mytask implements runnable

@override

public void run() catch (interruptedexception e)

}countdownlatch.countdown();

}//兩種synchronized方式都可以保證同步

public synchronized void sale() else

ticket--;

}public void sale1()

}}

public static void main(string args) 

}static class mytaskinthreadpool implements runnable catch (interruptedexception e)

--ticket;

}finally

}@override

public void run()

}

public static void main(string args) 

}class mytaskextends extends thread

@override

public void run() catch (interruptedexception e)

if (ticket <= 0)

if (b) else

ticket--;

thread.sleep(100);

} catch (interruptedexception e) finally

} else }}

}

public static void main(string args) );

//實質上還是以callable物件來建立並啟動執行緒

new thread(future,"有返回值的執行緒").start();

try catch (exception e)

}

public static void main(string args) 

system.out.println("主線程非同步提交執行計算,去做其他事情!");

system.out.println("主線程阻塞,等待非同步執行完成的資料");

for (futuretask ft : list)

} catch (interruptedexception e) catch (executionexception e)

}// 關閉執行緒池

fixedthreadpool.shutdown();

}class mytaskfuture implements callable

@override

public string call() throws exception else

// system.out.println(thread.currentthread().getname()+":::::售票:"+ticket);

return thread.currentthread().getname()+"成功售票:"+ticket--;

}else }}

return thread.currentthread().getname()+"售票結束,你沒搶到票";

}}

執行緒及執行緒池參考:

多執行緒的建立方式

1 繼承 thread 類 但 thread 本質上也是實現了 runnable 介面的乙個例項,它代表乙個執行緒的例項,並且,啟動執行緒的唯一方法就是通過 thread 類的 start 例項方法。start 方法是乙個 native 方法,它將啟動乙個新執行緒,並執行 run 方法。這種方式實現...

多執行緒之建立執行緒的方式

繼承thread類 1.新建乙個執行緒類繼承thread類 2.重寫run 3.在main方法中例項化執行緒物件 4.呼叫start public class thread01 class mythread extends thread 實現runnable介面 1.建立執行緒類並實現runnabl...

多執行緒 Callable執行緒建立方式

介面定義 callable介面 public inte ce callable runnable介面 public inte ce runnable 編寫類實現callable介面 實現call方法 class implements callable 建立futuretask物件 並傳入第一步編寫的...