खैर, किसी भी कार्यान्वयन विस्तार के बिना, यह जानना कठिन है, लेकिन के रूप में अपने परीक्षण का मामला पता चलता है, मैं हमेशा मिलता है आउटपुट की 220 लाइनें, यानि, FileWriter
के साथ लाइनों की निरंतर संख्या। ध्यान दें कि synchronized
का उपयोग यहां किया जाता है।
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* Working example of synchonous, competitive writing to the same file.
* @author WesternGun
*
*/
public class ThreadCompete implements Runnable {
private FileWriter writer;
private int status;
private int counter;
private boolean stop;
private String name;
public ThreadCompete(String name) {
this.name = name;
status = 0;
stop = false;
// just open the file without appending, to clear content
try {
writer = new FileWriter(new File("test.txt"), true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
for (int i=0; i<20; i++) {
new Thread(new ThreadCompete("Thread" + i)).start();
}
}
private int generateRandom(int range) {
return (int) (Math.random() * range);
}
@Override
public void run() {
while (!stop) {
try {
writer = new FileWriter(new File("test.txt"), true);
if (status == 0) {
writer.write(this.name + ": Begin: " + counter);
writer.write(System.lineSeparator());
status ++;
} else if (status == 1) {
writer.write(this.name + ": Now we have " + counter + " books!");
writer.write(System.lineSeparator());
counter++;
if (counter > 8) {
status = 2;
}
} else if (status == 2) {
writer.write(this.name + ": End. " + counter);
writer.write(System.lineSeparator());
stop = true;
}
writer.flush();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
के रूप में मैं समझता हूँ (और परीक्षण), इस प्रक्रिया में दो चरणों देखते हैं: सब बनाया है और शुरू कर दिया पूल में
- सभी सूत्र, फ़ाइल हड़पने के लिए तैयार;
- उनमें से एक यह पकड़ लेता है, और मैं यह तो लगता है कि आंतरिक रूप से यह ताले, अन्य सूत्र, पहुंच पाने के लिए क्योंकि मैं सामग्री है कि दो धागे से आते हैं के संयुक्त एक पंक्ति कभी नहीं रोकता है। तो जब कोई धागा लिख रहा है, तो अन्य लोग प्रतीक्षा कर रहे हैं जब तक कि यह लाइन को पूरा न करे, और बहुत संभावना है, फ़ाइल को रिलीज़ करता है। तो, कोई भी दौड़ की स्थिति नहीं होगी।
- दूसरों में से सबसे तेज़ फ़ाइल पकड़ लेता है और लिखना शुरू करता है।
ठीक है, यह सिर्फ एक भीड़ एक बाथरूम के बाहर इंतजार कर की तरह है ..... कतार बिना,
तो, अपने कार्यान्वयन अलग है, कोड दिखाने के लिए और हम इसे तोड़ने के लिए नीचे कर सकते हैं।
अच्छा, यह बहुत स्पष्ट नहीं है कि आपका कार्यान्वयन कैसा है। जैसा कि मेरा सरल परीक्षण केस दिखाता है, मुझे 20 थ्रेड के साथ फ़ाइलवाइटर के साथ आउटपुट की निरंतर रेखाएं मिलती हैं। कुछ कार्यान्वयन विवरण जोड़ना आवश्यक हो सकता है। मेरा जवाब देखें – FaithReaper