คำถามติดแท็ก multithreading

มัลติเธรดคือความสามารถของคอมพิวเตอร์หรือโปรแกรมในการทำงานพร้อมกันหรือแบบอะซิงโครนัสโดยใช้การประมวลผลหลายกระแสพร้อมกัน (โดยทั่วไปเรียกว่าเธรด)


9
การซิงโครไนซ์การเข้าถึง SimpleDateFormat
javadoc สำหรับ SimpleDateFormat ระบุว่า SimpleDateFormat ไม่ซิงโครไนซ์ "รูปแบบวันที่ไม่ซิงโครไนซ์ขอแนะนำให้สร้างอินสแตนซ์รูปแบบแยกกันสำหรับแต่ละเธรดหากเธรดหลายชุดเข้าถึงรูปแบบพร้อมกันจะต้องซิงโครไนซ์กับภายนอก" แต่อะไรคือแนวทางที่ดีที่สุดในการใช้อินสแตนซ์ของ SimpleDateFormat ในสภาพแวดล้อมแบบมัลติเธรด นี่คือตัวเลือกบางตัวที่ฉันคิดไว้ฉันเคยใช้ตัวเลือก 1 และ 2 ในอดีต แต่ฉันอยากรู้ว่ามีทางเลือกอื่นที่ดีกว่าหรือไม่หรือตัวเลือกใดที่จะให้ประสิทธิภาพและการทำงานพร้อมกันที่ดีที่สุด ตัวเลือกที่ 1: สร้างอินสแตนซ์ในเครื่องเมื่อจำเป็น public String formatDate(Date d) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(d); } ตัวเลือกที่ 2: สร้างอินสแตนซ์ของ SimpleDateFormat เป็นตัวแปรคลาส แต่ซิงโครไนซ์การเข้าถึง private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public String formatDate(Date d) { synchronized(sdf) …

8
การซิงโครไนซ์ฟิลด์ที่ไม่ใช่ขั้นสุดท้าย
คำเตือนจะแสดงทุกครั้งที่ฉันซิงโครไนซ์ในฟิลด์คลาสที่ไม่ใช่คลาสสุดท้าย นี่คือรหัส: public class X { private Object o; public void setO(Object o) { this.o = o; } public void x() { synchronized (o) // synchronization on a non-final field { } } } ดังนั้นฉันจึงเปลี่ยนการเข้ารหัสด้วยวิธีต่อไปนี้: public class X { private final Object o; public X() { o = new Object(); …

8
ฉันจะทำให้ ArrayList Thread-Safe ได้อย่างไร แนวทางอื่นในการแก้ปัญหาใน Java?
ฉันมี ArrayList ที่ฉันต้องการใช้เพื่อเก็บวัตถุ RaceCar ที่ขยายคลาสเธรดทันทีที่ดำเนินการเสร็จสิ้น คลาสที่เรียกว่า Race จะจัดการ ArrayList นี้โดยใช้วิธีการเรียกกลับที่อ็อบเจ็กต์ RaceCar เรียกใช้เมื่อดำเนินการเสร็จสิ้น วิธีการโทรกลับ addFinisher (RaceCar finisher) เพิ่มวัตถุ RaceCar ไปยัง ArrayList สิ่งนี้ควรจะให้ลำดับที่เธรดดำเนินการเสร็จสิ้น ฉันรู้ว่า ArrayList ไม่ซิงโครไนซ์ดังนั้นจึงไม่ปลอดภัยต่อเธรด ฉันลองใช้เมธอด Collections.synchronizedCollection (c Collection) โดยส่ง ArrayList ใหม่และกำหนด Collection ที่ส่งคืนไปยัง ArrayList อย่างไรก็ตามสิ่งนี้ทำให้ฉันมีข้อผิดพลาดของคอมไพเลอร์: Race.java:41: incompatible types found : java.util.Collection required: java.util.ArrayList finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)); นี่คือรหัสที่เกี่ยวข้อง: public class …

5
ทำความเข้าใจ java.lang.Thread.State: กำลังรอ (ที่จอดรถ)
อย่างแรกเป็นคำถามที่โง่มากฉันแค่สงสัยว่าคำว่า 'ที่จอดรถ' ที่รออยู่หมายความว่าอย่างไร กระทู้รอจอดอยู่หรือเพิ่งจอดจึงอยู่ในสถานะรอ? และเมื่อจอดรถนั้นจะใช้ทรัพยากร cpu / หน่วยความจำไปเท่าไหร่? จุดประสงค์ของการจอดด้ายคืออะไร? ประการที่สองโดยดูที่วิธีการจอดในjava thread API ปิดใช้งานเธรดปัจจุบันเพื่อจุดประสงค์ในการตั้งเวลาเธรดเว้นแต่จะมีใบอนุญาต หากใบอนุญาตพร้อมใช้งานจะถูกใช้และการโทรกลับทันที มิฉะนั้นเธรดปัจจุบันจะถูกปิดใช้งานเนื่องจากวัตถุประสงค์ในการตั้งเวลาเธรดและอยู่เฉยๆจนกว่าหนึ่งในสามสิ่งจะเกิดขึ้น ..... ภาษาอังกฤษไม่ใช่ภาษาหลักของฉันดังนั้นฉันจึงมีปัญหาในการทำความเข้าใจฉันตั้งใจให้ 'อนุญาต' เป็น 'อนุญาตให้จอดกระทู้' ดังนั้นคำถามที่ตามมา: ความหมายของสิ่งนั้นคือ 'ใบอนุญาต' คืออะไรและใครจะตรวจสอบใบอนุญาตเหล่านั้นได้อย่างไร? นั่นหมายความว่าอย่างไร: 'ถ้ามีใบอนุญาตก็จะถูกใช้ไป' มันถูก 'จอด' หรือไม่? ต่อไปนี้ถ้าจุดที่สองเป็นจริงดังนั้นความแตกต่างระหว่าง 'ที่จอดรถ' และ 'อยู่เฉยๆ' คืออะไร? ถ้าฉันมีใบอนุญาตฉันสามารถจอดได้ตลอดไปและถ้าไม่ฉันสามารถทำให้มัน 'อยู่เฉยๆ' ได้? ขอบคุณ

3
PHP Thread Safe และ Non-Thread Safe สำหรับ Windows
ฉันกำลังดาวน์โหลด PHP สำหรับ Windows ฉันมี 2 ตัวเลือกในเว็บไซต์ PHP Thread ปลอดภัย PHP Non-Thread ปลอดภัย กรุณาตอบคำถามต่อไปนี้: อะไรคือความแตกต่างระหว่างทั้งสอง? อะไรคือข้อดีและข้อเสียมากกว่ากัน? ฉันกำลังพัฒนาเว็บไซต์อีคอมเมิร์ซที่มีผู้เข้าใช้งานหนาแน่นแนะนำให้ใช้อันไหนมากกว่ากันและเพราะเหตุใด

9
Android SDK AsyncTask doInBackground ไม่ทำงาน (คลาสย่อย)
ณ วันที่ 15/2/2012 ฉันยังไม่พบคำอธิบายที่ดีหรือเหตุผลว่าทำไมจึงใช้ไม่ได้ วิธีแก้ปัญหาที่ใกล้เคียงที่สุดคือการใช้วิธีเธรดแบบเดิมแต่เหตุใดจึงรวมคลาสที่ไม่ (ดูเหมือนจะ) ทำงานใน Android SDK Evenin 'SO! ฉันมีคลาสย่อย AsyncTask: // ParseListener had a callback which was called when an item was parsed in a // RSS-xml, but as stated further down it is not used at all right now. private class xmlAsync extends AsyncTask<String, RSSItem, Void> …

16
ฉันได้ยินมาว่า i ++ ไม่ปลอดภัยต่อเธรด ++ i เธรดปลอดภัยหรือไม่
ฉันได้ยินมาว่า i ++ ไม่ใช่คำสั่งที่ปลอดภัยต่อเธรดเนื่องจากในการประกอบมันจะลดลงไปที่การจัดเก็บค่าดั้งเดิมเป็นอุณหภูมิที่ใดที่หนึ่งเพิ่มขึ้นแล้วแทนที่ซึ่งอาจถูกขัดจังหวะโดยสวิตช์บริบท อย่างไรก็ตามฉันสงสัยเกี่ยวกับ ++ i เท่าที่ฉันสามารถบอกได้สิ่งนี้จะลดลงเป็นคำสั่งประกอบเดียวเช่น 'เพิ่ม r1, r1, 1' และเนื่องจากเป็นเพียงคำสั่งเดียวจึงไม่สามารถขัดจังหวะได้โดยสวิตช์บริบท ใครช่วยชี้แจงหน่อย ฉันสมมติว่ามีการใช้แพลตฟอร์ม x86
90 c++  c  multithreading 

7
การเข้าถึงตัวจัดการเธรด UI จากบริการ
ฉันกำลังลองสิ่งใหม่ ๆ บน Android ซึ่งฉันจำเป็นต้องเข้าถึงตัวจัดการเธรด UI ฉันรู้สิ่งต่อไปนี้: เธรด UI มีตัวจัดการและตัววนรอบของตัวเอง ข้อความใด ๆ จะถูกใส่ลงในคิวข้อความของเธรด UI ลูปเกอร์รับเหตุการณ์และส่งต่อไปยังตัวจัดการ ตัวจัดการจะจัดการข้อความและส่งเหตุการณ์เฉพาะไปยัง UI ฉันต้องการมีบริการของฉันซึ่งต้องได้รับตัวจัดการเธรด UI และใส่ข้อความลงในตัวจัดการนี้ เพื่อให้ข้อความนี้ได้รับการประมวลผลและจะออกไปยัง UI ที่นี่บริการจะเป็นบริการปกติซึ่งจะเริ่มโดยแอปพลิเคชันบางส่วน ฉันต้องการทราบว่าเป็นไปได้หรือไม่ ถ้าเป็นเช่นนั้นโปรดแนะนำข้อมูลโค้ดเพื่อที่ฉันจะได้ลองใช้ ขอแสดงความนับถือ Girish

11
ถูกกฎหมายหรือไม่ที่จะเรียกวิธีการเริ่มต้นสองครั้งบนเธรดเดียวกัน
รหัสต่อไปนี้นำไปสู่java.lang.IllegalThreadStateException: Thread already startedเมื่อฉันเรียกstart()method ครั้งที่สองในโปรแกรม updateUI.join(); if (!updateUI.isAlive()) updateUI.start(); นี้เกิดขึ้นสองครั้งที่updateUI.start()ถูกเรียกว่า updateUI.start()ฉันได้ก้าวผ่านมันหลายครั้งและด้ายที่เรียกว่าสมบูรณ์และทำงานให้เสร็จก่อนกดปุ่ม การโทรupdateUI.run()หลีกเลี่ยงข้อผิดพลาด แต่ทำให้เธรดทำงานในเธรด UI (เธรดการเรียกตามที่กล่าวไว้ในโพสต์อื่น ๆ บน SO) ซึ่งไม่ใช่สิ่งที่ฉันต้องการ เธรดสามารถเริ่มต้นได้เพียงครั้งเดียวหรือไม่? ถ้าเป็นเช่นนั้นฉันจะทำอย่างไรหากต้องการเรียกใช้เธรดอีกครั้ง เธรดนี้กำลังทำการคำนวณบางอย่างในพื้นหลังหากฉันไม่ได้ทำในเธรดมากกว่าที่ทำในเธรด UI และผู้ใช้มีการรอนานอย่างไม่มีเหตุผล

6
ฉันต้องได้รับการล็อคก่อนที่จะเรียก condition_variable.notify_one () หรือไม่
ฉันสับสนเล็กน้อยเกี่ยวกับการใช้std::condition_variable. ฉันเข้าใจว่าฉันต้องสร้างunique_lockบนก่อนที่จะเรียกmutex condition_variable.wait()สิ่งที่ฉันไม่สามารถหาคือว่าฉันควรจะได้รับการล็อคที่ไม่ซ้ำกันก่อนที่จะเรียกหรือnotify_one()notify_all() ตัวอย่างในcppreference.comขัดแย้งกัน ตัวอย่างเช่นหน้าแจ้งเตือนให้ตัวอย่างนี้: #include <iostream> #include <condition_variable> #include <thread> #include <chrono> std::condition_variable cv; std::mutex cv_m; int i = 0; bool done = false; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cout << "Waiting... \n"; cv.wait(lk, []{return i == 1;}); std::cout << "...finished waiting. i == 1\n"; done = true; } …

9
ตรวจสอบและล็อค
เมื่อใดจึงเหมาะสมที่จะใช้Monitorคลาสหรือlockคีย์เวิร์ดเพื่อความปลอดภัยของเธรดใน C # แก้ไข: ดูเหมือนว่าจากคำตอบที่ผ่านมาlockนั้นสั้นสำหรับชุดของการโทรไปยังMonitorชั้นเรียน กุญแจล็อคสายสั้นมีไว้เพื่ออะไร? หรือชัดเจนกว่านั้น class LockVsMonitor { private readonly object LockObject = new object(); public void DoThreadSafeSomethingWithLock(Action action) { lock (LockObject) { action.Invoke(); } } public void DoThreadSafeSomethingWithMonitor(Action action) { // What goes here ? } } อัปเดต ขอบคุณทุกคนสำหรับความช่วยเหลือ: ฉันได้โพสต์คำถามอื่นเพื่อติดตามข้อมูลบางส่วนที่คุณให้มา เนื่องจากคุณดูเหมือนจะมีความเชี่ยวชาญในด้านนี้เป็นอย่างดีฉันจึงโพสต์ลิงก์: มีอะไรผิดปกติกับวิธีแก้ปัญหานี้ในการล็อกและจัดการข้อยกเว้นที่ถูกล็อก

4
Platform.runLater และ Task ใน JavaFX
ฉันได้ทำการค้นคว้าเกี่ยวกับเรื่องนี้มาบ้าง แต่ฉันก็ยังสับสนมากที่จะพูดอย่างน้อยที่สุด ใครช่วยยกตัวอย่างที่เป็นรูปธรรมว่าควรใช้Taskเมื่อไรและควรใช้เมื่อPlatform.runLater(Runnable);ใด อะไรคือความแตกต่าง? มีกฎทองในการใช้สิ่งเหล่านี้หรือไม่? แก้ไขฉันด้วยถ้าฉันผิด แต่ "Object" ทั้งสองนี้ไม่ใช่วิธีการสร้างเธรดอื่นภายในเธรดหลักใน GUI (ใช้สำหรับอัปเดต GUI)?


3
ฟังก์ชันพื้นหลังใน Python
ฉันมีสคริปต์ Python ที่บางครั้งแสดงภาพให้กับผู้ใช้ ในบางครั้งรูปภาพอาจมีขนาดค่อนข้างใหญ่และมักจะนำมาใช้ซ้ำ การแสดงข้อความเหล่านี้ไม่สำคัญ แต่การแสดงข้อความที่เกี่ยวข้องคือ ฉันมีฟังก์ชันที่ดาวน์โหลดรูปภาพที่ต้องการและบันทึกไว้ในเครื่อง ตอนนี้มันทำงานในแนวเดียวกับรหัสที่แสดงข้อความถึงผู้ใช้ แต่บางครั้งอาจใช้เวลานานกว่า 10 วินาทีสำหรับภาพที่ไม่ใช่ในเครื่อง มีวิธีใดบ้างที่ฉันสามารถเรียกใช้ฟังก์ชันนี้เมื่อจำเป็น แต่เรียกใช้ในพื้นหลังในขณะที่โค้ดยังคงทำงานอยู่ ฉันจะใช้ภาพเริ่มต้นจนกว่าภาพที่ถูกต้องจะพร้อมใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.