java賣票
㈠ java多線程的賣票問題
首先,定義的鎖(lock)不對,必須是同一個鎖,像你這樣用this,new多少個MyThread就有多少個鎖,違反了線程的同步機制;
其次,你如果想要呈現多線程的競爭,不可以在run方法里讓一個線程一直運行而不釋放鎖,應該使用wait()/notify();
以下我稍微修改下,會形成兩個線程交替執行的情形:
publicclassThreadTest{
publicstaticObjectobj=newObject();
publicstaticintnumber=10;//用static共享票源,不知道可以不,按理說是可以的
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
MyThreadmy=newMyThread();
MyThreadmy2=newMyThread();
Threadt1=newThread(my2,"2號窗口");
Threadt2=newThread(my,"1號窗口");
t1.start();
t2.start();
}
{
publicvoidrun(){
while(true)
synchronized(obj){
if(number>0){
System.out.println(Thread.currentThread().getName()
+"正在賣票,"+"還剩"+number+"張票");
number--;
obj.notifyAll();
try{
obj.wait();
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}else
break;
}
}
}
}
㈡ Java中賣票問題
Thread-0線程正在賣第100張票
Thread-1線程正在賣第100張票
Thread-1線程正在賣第98張票
Thread-1線程正在賣第97張票
Thread-1線程正在賣第96張票
Thread-1線程正在賣第95張票
Thread-1線程正在賣第94張票
Thread-1線程正在賣第93張票
Thread-0線程正在賣第99張票
看清楚就知道:首先:0和1都拿到了第100張,0列印出來了,--了,然後0就拿了第99張,之後0就掛起了,然後1列印出來了,--了,然後1就拿了第98張,到後面0就把上次拿到的99列印出來
你new出來的兩個線程都有獨立的內存空間,你那個靜態的tickets變數,每個線程用都會先從A類那個內存空間那裡拿過來放到各自的空間里。
如果加上一個鎖塊就不同了,它保證每次只有一個線程在拿tickets,每次只有一個線程在--;
㈢ 用JAVA編寫一個售票系統
上面的幾位說的對啊,5分就要一個小型的系統,而且還是JAVA寫的,看來是想要B/S模式的了。
㈣ 用java模擬四個售票點,不重復的賣出100張票(票的編號為1--100),售完為止。
/**
* 請用線程來完成,規則為:售票點一和三,只能銷售編號為奇數的票,如1,3,5,7.......;售票點二隻能銷售
* 編號為2的倍數的票,如2,4,8.......;售票點四,只能銷售編號為4的倍數的票如4,8,12....
* */
package 多線程;
public class TicketTest {
public static void main(String[] args) {
Ticket3 t=new Ticket3();
new Thread(t,"售票點一").start();
new Thread(t,"售票點二").start();
new Thread(t,"售票點三").start();
new Thread(t,"售票點四").start();
}
}
class Ticket3 implements Runnable
{
private int ticket=100;//共享數據
public void run()
{
while(true)//每個窗口都一致循環賣票,直到ticket為0,便結束循環
{
synchronized(Ticket.class)//每個線程進來都先判斷鎖,
{
if(ticket>0)
{
if(Thread.currentThread().getName().equals("售票點一")||Thread.currentThread().getName().equals("售票點三"))
{
if(ticket%2!=0)
{
System.out.println(Thread.currentThread().getName()+":賣出"+ticket+"號票");
ticket--;
}
else
{
continue;
}
}
else
{
if(ticket%2==0)
{
System.out.println(Thread.currentThread().getName()+":賣出"+ticket+"號票");
ticket--;
}
else
{
continue;
}
}
}
}
if(ticket==0)//每個線程都在賣掉一張票後判斷是否還有票,沒有就結束循環,run方法結束
return;
}
}
}
㈤ java編寫的火車票賣票程序,用synchronized解決了一張票被賣多次問題,可又發現每次10
讓每個線程只能買一張,買了就解鎖,然後回到線程池裡面等下一次搶到機會。
㈥ JAVA火車票售票系統
這個需要多線程的。網上簡單的教程很多的。一般老師都拿這個來舉例子。
㈦ java三個線程賣票問題
很簡單 線程1 運行了 sellTicket,還沒列印的時候 ,線程二又運行了sellTicket。兩者列印的時候結果就是相同的。
解決辦法。sellTicket時添加返回值。列印的時候把返回值打出來就好了。
㈧ java如何寫火車站售票系統窗口
很簡單 我給你個我寫的程序,你可以參考一下 不懂的問我。
public class Shoupiao {
public static void main(String[] args) {
chushou c1=new chushou("A地火車站",10);
c1.start();//調用Thread中的run方法需要用start();
chushou c2=new chushou("B地火車站",5);
c2.start();
chushou c3=new chushou("C地火車站",8);
c3.start();
try {
c1.join(); //執行完 c1 c2 c3 在繼續執行 目的讓結束最後輸出
c2.join();
c3.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("結束");
}
}
//新建一個類
class chushou extends Thread{//用繼承Thread的方法來實現多線程
String iname;
public void run() {
for(int i=inumber;i>0;i--){
System.out.println(iname+"火車票賣出一張"+"剩餘"+(i-1)+"張");
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
int inumber;
public String getIname() {
return iname;
}
public void setIname(String iname) {
this.iname = iname;
}
public int getInumber() {
return inumber;
}
public void setInumber(int inumber) {
this.inumber = inumber;
}
public chushou(String iname, int inumber) {
this.iname = iname;
this.inumber = inumber;
}
}
㈨ 100張票,用java多線程實現3個窗口按順序依次賣票,如何實現
很簡單, 出票里加鎖就行了完整代碼:
publicclassTest{
publicstaticvoidmain(String[]args){
for(inti=0;i<3;i++){
newThread("線程"+i){
publicvoidrun(){
while(true){
intp=getNumber();
if(p>0){
System.out.println(getName()+"票號:"+p);
}else{
System.out.println("沒票了");
break;
}
}
};
}.start();
}
}
publicstaticintnum=100; //總票數
/**
*synchronized同步鎖
*@return
*/
(){
if(num>0){
returnnum--; //如果大於0,則返回當前票並減少一張
}
return0;
}
}
㈩ java用了sychoronized多線程 賣票問題 賣出了兩個第一張票
這里的synchronized (aa)直接改為synchronized (「1」); 實例變數String aa = new String("1");可以去掉了,你在下面啟用線程的時候是兩個對象,不是同一個對象,嚴格來說已經沒意義了,只是你的ticket 變數是static,因此是兩個實例共享的變數,這種東西正確的做法是ticket 聲明為實例變數,
Xc88 xcaa = new Xc88();
Thread bb = new Thread(xcaa);
bb.start();
Thread cc = new Thread(xcaa );
cc.start();
這也是兩個線程,用一個資源,而且這樣可以直接使用同步方法,不用同步塊,另外提示,類名和變數名還有方法名取點有意義名字。