我有以下任務:
創建名為:ElementsProvider(int n, List elements) 的類,它將在給定串列中提供 N 個隨機元素。Elements Provider 將是一個執行緒。嘗試創建 4 個實體,每個實體都會在串列中添加 1000 個隨機元素。一次啟動所有實體并等待它們結束。列印串列大小。
這就是所做的,
主要的:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ElementsProvider implements Runnable{
private final List<Integer> list;
private final int n;
public ElementsProvider(List<Integer> list, int n){
this.list = list;
this.n = n;
}
@Override
public void run() {
Random random = new Random();
for (int i = 0; i < n; i ) {
list.add(random.nextInt());
}
}
public static void main(String[] args) throws InterruptedException {
List<Integer> list = new ArrayList<>();
int n = 1000;
ElementsProvider e1 = new ElementsProvider(list, n);
ElementsProvider e2 = new ElementsProvider(list, n);
ElementsProvider e3 = new ElementsProvider(list, n);
ElementsProvider e4 = new ElementsProvider(list, n);
Thread t1 = new Thread(e1);
Thread t2 = new Thread(e2);
Thread t3 = new Thread(e3);
Thread t4 = new Thread(e4);
t1.start();
t2.start();
t3.start();
t4.start();
t1.join();
t2.join();
t3.join();
t4.join();
System.out.println(list);
}
}
顯然我知道任務不正常。
我得到的反饋是:
錯誤,嘗試列印串列大小,每次運行程式都會不同。
有人可以指出我錯在哪里嗎?
uj5u.com熱心網友回復:
您在上面對原始問題的評論中提出了此更改:
@Override public void run() { synchronized (ElementsProvider.class) { Random random = new Random(); for (int i = 0; i < n; i ) { list.add(random.nextInt()); } } }
好的,這將確保您的程式始終列印正確的答案,但這樣做是通過使您的程式有效地單執行緒來實作的。當您將執行緒run()方法的整個主體放在一個synchronized塊中時,可以防止它們同時運行。但是,并發運行是使用執行緒的唯一原因。
您需要同步一小部分代碼。執行緒共享的唯一變數是list. 沒有理由new Random()進入synchronized塊內,也沒有理由進入塊random.nextInt()內。唯一需要在synchronized塊內的是list.add()呼叫。
uj5u.com熱心網友回復:
我會在你的ElementsProvider類中添加一個靜態信號量:
public class ElementsProvider implements Runnable {
private final List<Integer> list;
private final int n;
private static Semaphore semaphore = new Semaphore(1);
public ElementsProvider(List<Integer> list, int n) {
this.list = list;
this.n = n;
}
@Override
public void run() {
Random random = new Random();
List<Integer> l = new ArrayList<>(n);
for (int i = 0; i < n; i ) {
l.add(random.nextInt());
}
try {
semaphore.acquire();
System.out.println("Adding " l.size() " elements to list");
list.addAll(l);
} catch (Exception e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486649.html
