[英]how to achieve mutual exclusion using synchronized method in this application
我在這里遇到了一個小問題。 我正在用Java執行並發程序。 問題是:有4個人(學生)試圖訪問打印機,以打印5個文檔。 但是當時(很明顯)只能打印5張文件。 完成后,他們會通知其他人已完成操作,並且其他線程將訪問該資源。 我有一個主班,一個學生班和一個監視器(激光打印機),一個文檔班,保存有關文檔的信息,例如(頁數,名稱用戶ID等)+打印機的幾個接口。 我已經成功運行了線程,但是它們沒有同步(互斥)
所以問題是我如何實現互斥(在文檔數量時只有一個人可以打印)
感謝您的關注,時間和提示:)
主班
String S1Name = "bob";
String S2Name = "klara";
String S3Name = "John";
String S4Name = "Iga";
String T1Name = "Man";
String T2Name = "Woman";
final int NoOfDocs = 5;
ServicePrinter sp = new LaserPrinter();
ThreadGroup groupA = new ThreadGroup("Group A");
ThreadGroup groupB = new ThreadGroup("Group B");
Student student1 = new Student(sp,NoOfDocs,S1Name, groupA);
Student student2 = new Student(sp,NoOfDocs,S2Name, groupA);
Student student3 = new Student(sp,NoOfDocs,S3Name, groupA);
Student student4 = new Student(sp,NoOfDocs,S4Name, groupA);
TonerTechnician TT = new TonerTechnician(groupB);
PaperTechnician PT = new PaperTechnician(groupB);
/*
* Start Student Threads
*/
student1.start();
student2.start();
student3.start();
student4.start();
/*
* Start Technician threads
*/
TT.start();
PT.start();
學生班
private final ServicePrinter serviceprinter;
private final int NoOfDocs;
private final String Name;
private final ThreadGroup threadgroup;
public Student(ServicePrinter serviceprinter, int NoOfDocs, String Name, ThreadGroup threadgroup)
{
this.serviceprinter = serviceprinter;
this.NoOfDocs = NoOfDocs;
this.Name = Name;
this.threadgroup = threadgroup;
}
@Override
public void run()
{
/*
* each students prints 5 documents (different name and length)
*/
final LaserPrinter lp = new LaserPrinter();
//sleep from 1 to 5 sec random time
final Random random = new Random();
char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
StringBuilder sb = new StringBuilder();
/*
* Create random document name 10 characters long
*/
for (int i = 0; i < 10; i++)
{
char c = chars[random.nextInt(chars.length)];
sb.append(c);
}
String docName = sb.toString();
/*
* print 5 documents (random sleep time between printing)
*/
for(int i = 0; i < NoOfDocs; i++)
{
try
{
Document coursework = new Document(Name,docName,random.nextInt(90)+10);
lp.printDocument(coursework);
Thread.sleep(random.nextInt(1000)+4000);
}
catch (InterruptedException ex)
{
Logger.getLogger(Student.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("User: " + Name+ " completed printing");
班長班
int tonerLevel = 500;
int paperLevel = 250;
private final String PrinterName = "HP";
private final String PrinterID = "LX-440";
private int CurrentPaperLevel;
private int CurrentTonerLevel;
private int NoOfDocsPrinted;
@Override
public synchronized void printDocument(Document document) {
System.out.println(document);
}
這是一個簡單的互斥量實現,但是您應該使用java.util.concurrent包進行同步
編輯:將互斥量更改為信號量(更有意義)
一個簡單的互斥體實現:
public class Mutex {
private int semaphore;
public synchronized void aquire() throws InterruptedException {
if(semaphore < 0) {
wait();
}
semaphore--;
}
public synchronized void release() {
if(semaphore < 0) {
semaphore++;
notify();
}
}
}
看來您是在run方法中創建本地打印機對象,而不是使用傳遞給Student
類的共享對象。 嘗試使用通過的共享打印機,看看會得到什么。 另外,我們還需要了解如何在ServicePrinter
使用printDocument
。 這是因為您在Student
類中使用了ServicePrinter
對象,並且ServicePrinter
的printDocument
的實現可能不正確(也就是說,如果您實際上在超類中實現了它)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.