2015-11-02 40 views
1

我试图模拟一个包含2层20个车位和2项和2个出口的停车场录入系统。我正在使用Java线程,我曾尝试使用thread.wait()thread.sleep但他们没有做出一个线程跑后帮另一个线程结束。如何运行另一个线程后一个线程已经完成了它的行动

这是我想出迄今:

ShardedDataThread.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class SharedDataThread extends Thread { 
     private SharedData mySharedData; 
     private String myThreadName; 
     public int L1 = 20; 
     public int L2 = 20; 


//Setup the thread 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
SharedDataThread(String name, SharedData sharedstuff) { 
    super(name); 
    mySharedData=sharedstuff; 
    myThreadName=name; 
} 

//This is called when "start" is used in the calling method 

public void run() { 
    while(true){ 

    System.out.println("Entry or Exit?"); 
    String input = null; 
    try { 
     input = br.readLine(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 



    if (input.equalsIgnoreCase("entry")) { 

      try { 
       // Acquire the lock using the acquireLock() method 
       // The thread will pause here on wait() until it gets a lock 
       mySharedData.acquireLock(); 

       //use park method to occupy one space 
       this.park(); // Increment the number of reads 
       mySharedData.releaseLock(); 
      } 
      catch(InterruptedException e) { 
       System.err.println("Failed to get lock when reading:"+e); 
      } 
      } 
      else { 

      try { 

       mySharedData.acquireLock(); 
       System.out.println(myThreadName+" is writing"); 
       exit(); // INCREMENT ONE SPOT 

       mySharedData.releaseLock(); // releases the lock 
      } 
      catch(InterruptedException e) { 
       System.err.println("Failed to get lock when writing:"+e); 
      } 
     } 

     System.out.println("L1 has : "+L1+" "+"L2 has: "+" "+L2); 

    } 
//while ends 
} 
//State method 


    public void park() { 
     if (L1>0 && L1<=20){ 
      L1= L1-1; 
      } 

      else if (L1==0 && L2<=20 && L2>0){ 
       L2= L2-1; 

       } 
      else if (L1==0 && L2==0){ 
       System.out.println("No Spaces Left"); 
       } 
} 

    public void exit() { 
     if (L1<20) { 
      L1 = L1 +1; 
     } else if (L2<20) { 
      L2 = L2+1; 
     } 
} 

     public static void main(String[] args) throws InterruptedException { 

      SharedData mySharedData = new SharedData(); 



      SharedDataThread myThread1 = new SharedDataThread("Entry1", mySharedData); 
      //SharedDataThread myThread2 = new SharedDataThread("Entry2", mySharedData); 
      //SharedDataThread myThread3 = new SharedDataThread("Exit1", mySharedData); 
      //SharedDataThread myThread4 = new SharedDataThread("Exit2", mySharedData); 

      // Now start the threads executing 

      myThread1.start(); 
      //myThread1.join(); 
      //myThread2.start(); 
      //myThread2.join(); 
      //myThread3.start(); 
      //myThread3.join(); 
      //myThread4.wait(); 
      } 


} 

SharedData.java

public class SharedData { 

    private boolean accessing=false; // true a thread has a lock, false otherwise 

    // attempt to acquire a lock 
    public synchronized void acquireLock() throws InterruptedException{ 
    Thread me = Thread.currentThread(); 


    while (accessing) { 
     wait(); 
    } 

    accessing = true; 

    } 

    // Releases a lock to when a thread is finished 

    public synchronized void releaseLock() { 
     //release the lock and tell everyone 
     accessing = false; 
     notifyAll(); 
     Thread me = Thread.currentThread(); // get a ref to the current thread 
    } 

} 
+2

的Thread.join .......... –

回答

0

你在思考的问题错误。在线程完成后,不要考虑等待线程做些什么。在完成一些工作后,想想做些什么。这意味着这项工作必须是可以等待的。

+0

如果我理解正确的话,你要我,而第一个线程完成它的行动,例如它会工作开始第二个线程,如果第二个线程使用在第一个线程运行时退出? – user2631932

+0

我希望你停止思考线索并思考工作。你的问题不是“线程Y完成时我要启动线程X”,而是“当工作Y完成时我想做X工作”。 –

1

这从来没有让任何意义:

myThread1.start(); 
myThread1.join(); 

它从来没有让任何意义启动一个线程,然后立即等待它完成。有线程的整个观点是不同的线程可以同时做不同的事情

如果在myThread1正在运行时没有任何其他呼叫者想要执行的操作,那么没有理由创建myThread1。来电者应该做的是myThread1在那个时候会做的。


不要使用线程来模拟模拟对象。用线程做工作。通常情况下,这意味着,使用线程池java.util.concurrent.ThreadPoolExecutor执行任务

如果你想你的模拟实时运行,不使用线程sleep()。使用调度java.util.concurrent.ScheduledThreadPoolExecutor执行延迟任务。

相关问题