您好,登錄后才能下訂單哦!
搶票案例:
public class n {
public static void main(String[]args) throws InterruptedException
{
web wb=new web();
new Thread(wb,"a").start();
new Thread(wb,"b").start();
new Thread(wb,"c").start();
}
}
class web implements Runnable{
int num=10;
private boolean flag=true;
public void run()
{
while(flag)
{
test();
}
}
public void test()
{ if(num<0)
{
flag=false;
return;
}
try {
Thread.sleep(200);
}catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->"+num--);
//線程不安全,可能都都是同一張票,可能票是負數
//負數:當還有1張票時,三個線程同時進入,都等待后,有兩個線程為負數
//相同票:線程有自己的工作臺,多個線程幾乎同時到達,拷貝數據
}
}
賬戶存取款案例:
當類繼承了Thread,構造時super(String name)可以設置線程名字
取錢:
只剩一張錢,多個線程取同一張錢
多個線程同時抵達,一個存一張錢,一個取一張錢,導致個人賬戶錢不變
public class el {
public static void main(String[]args)
{
account a=new account(100,"me");
get g=new get(a,80,"she");
get g2=new get(a,90,"he");
g.start();
g2.start();
}
}
//賬戶
class account {
int money;
String name;
public account(int money,String name)
{
this.money=money;
this.name=name;
}
}
//模擬取款
class get extends Thread
{
account a; //取錢的賬戶
int getmoney; //單個人取的錢數
int getall; //多個人取的總數
public get (account a,int getmoney,String name)
{
super(name);//Thread可以設置name
this.a=a;
this.getmoney=getmoney;
}
public void run()
{
if(a.money-getmoney<0) //添加也沒用
{
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a.money-=getmoney;
getall+=getmoney;
System.out.println(this.getName()+"-->賬戶余額為:"+a.money);
System.out.println(this.getName()+"-->取錢總數為:"+getall);
}
}
操作容器案例:
可能會有容器元素被覆蓋,多個線程同時進入一個位置
public class h {
public static void main(String[]args)
{
List<String> list=new ArrayList<String>();
for(int i=0;i<10000;i++)
{
new Thread(()->
{list.add(Thread.currentThread().getName());}
).start();
}
System.out.println(list.size());
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。