Rumah > Soal Jawab > teks badan
阿神2017-04-18 10:10:52
Saya baru sahaja menonton pengaturcaraan serentak praktikal hari ini tentang pelepasan selamat dan akses objek boleh ubah:
Keluaran selamat:
Mulakan rujukan objek dalam fungsi permulaan statik;
Kemudian kita mesti memastikan akses selamat Memandangkan senarai itu tidak boleh diakses dengan selamat dalam tiga situasi pertama, kita hanya boleh bergantung pada menyekat dunia luar apabila. menerbitkan objek, iaitu mengunci. static List<String> arrayList = new ArrayList<>();
PHP中文网2017-04-18 10:10:52
Ia boleh direalisasikan mengikut permintaan subjek, tetapi realisasi permintaan ini sangat pelik.
private static void test1(final int i) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (arrayList) {
while (arrayList.size() != i) {
try {
arrayList.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
arrayList.add(i, i + "position");
arrayList.notifyAll();
}
}
}).start();
}
Selain kaedah ini, ia juga boleh dicapai melalui join
dan lulus countdownlatch
Jika anda benar-benar ingin menjadi seperti subjek, lebih baik tidak menggunakan multi-threading
天蓬老师2017-04-18 10:10:52
Menggunakan kaedah invokeAll bagi kumpulan benang boleh memastikan bahawa susunan keputusan adalah konsisten dengan susunan parameter yang diluluskan dalam
黄舟2017-04-18 10:10:52
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(10);
List<Callable<Integer>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(newTask(i));
}
try {
for (Future<Integer> future : exec.invokeAll(list)) {
try {
System.out.println(future.get());
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
exec.shutdown();
}
static Callable<Integer> newTask(final int t) {
return new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("newTask: " + t);
try {
Thread.sleep((10 - t) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return t;
}
}
}