我有一個類,我在其中定義了一個帶有添加和洗掉方法的串列,如下所示:
public class listClass{
private List<T> someList = new ArrayList<>();
public void add(){
//adds to list
}
public void delete(){
//deletes from list
}
}
我有另一個類,我在其中定義了兩個執行緒和一個物件,我可以從中訪問我的串列。一個執行緒應該使用 add 方法連續添加到串列中,另一個執行緒應該使用 delete 方法從串列中連續洗掉相應的執行緒號:
public class threadClass extends Thread{
private int threadNumber;
public ThreadClass(int threadNumber){
this.threadNumber = threadNumber;
}
listClass listClassObject = new listClass();
public void run(){
if(threadNumber == 1){
while(true){/*add*/}
}
else if(threadNumber ==2){
while(true){/*delete*/}
}
}
}
我該怎么做才能讓兩個執行緒都操作同一個串列?
我當前的實作有一個不同的類,它有一個 main 方法,我在這里呼叫執行緒:
public static void main(String[] args){
threadClass threadForAddingMediaFiles = new threadClass(1);
threadClass threadForDeletionMediaFiles = new threadClass(2);
threadForAddingMediaFiles.start();
threadForDeletionMediaFiles.start();
當前實作的問題是每個執行緒都創建自己的串列實體(這對我來說很清楚,因為串列在同一個類中),因此每個執行緒都在操作自己的串列,而不是一個通用串列。
uj5u.com熱心網友回復:
我認為發生這種情況是因為您在每個 threadClass 物件中實體化了一個新的 listClass,因此當您修改串列時,實際上是在每個執行緒中修改它們自己的“本地”副本。嘗試在您的 main 函式中實體化串列,然后將其傳遞給您的執行緒,這樣您的串列類的單個實體就會由您的兩個執行緒操作。
public static void main(String[] args){
listClass myList = new listClass();
threadClass threadForAddingMediaFiles = new threadClass(1, myList);
threadClass threadForDeletionMediaFiles = new threadClass(2, myList);
threadForAddingMediaFiles.start();
threadForDeletionMediaFiles.start();
然后修改你的執行緒實作:
public class threadClass extends Thread{
private int threadNumber;
private listClass listToHandle;
public ThreadClass(int threadNumber, listClass listToHandle){
this.threadNumber = threadNumber;
this.listToHandle = listToHandle;
}
public void run(){
if(threadNumber == 1){
while(true){/*add*/}
}
else if(threadNumber ==2){
while(true){/*delete*/}
}
}
}
最后請記住將您的添加和洗掉方法都放在您的串列類中同步,否則您將在并發訪問方面遇到一些問題。
public class listClass{
private List<T> someList = new ArrayList<>();
public synchronized void add(){
//adds to list
}
public synchronized void delete(){
//deletes from list
}
}
你也可以看看CopyOnWriteArrayList,它是 ArrayList 的執行緒安全實作。但是,正如檔案中所說,這通常是一個昂貴的實作,可能不適合您的問題。
uj5u.com熱心網友回復:
在現代 Java 中,我們很少Thread
直接處理類。相反,請使用添加到 Java 5 的 Executors 框架。這已在許多現有的問題和答案中進行了介紹,因此請搜索以了解更多資訊。
將您的任務定義為 aRunnable
而不是 a Thread
。
至于跨執行緒共享您的串列管理器,請創建一個實體。確保您的串列管理器是執行緒安全的。您當前的實作不是執行緒安全的。一種解決方案是將添加和洗掉方法都標記為synchronized
.
將串列管理器物件的一個??實體傳遞給Runnable
任務物件的建構式。每個都Runnable
保留對該串列管理器的參考作為私有成員欄位。然后,您的所有可運行檔案共享同一個串列管理器。
將所有Runnable
物件提交到ExecutorService
.
同樣,所有這些已經被多次覆寫。搜索以了解更多資訊。
uj5u.com熱心網友回復:
您可以使用 Collections.synchronizedList() 然后無需將同步添加到添加/洗掉方法中。創建 ListClass 的一個實體,然后將其傳遞給 2 個執行緒的兩個建構式。
class listClass
{
private List<T> someList = Collections.synchronizedList(new ArrayList<>());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470121.html
上一篇:從共享首選項中洗掉專案后如何更新Rcyclerview
下一篇:如果它崩潰了如何重新啟動子行程?