Langsung ke intinya
Di kalangan TI, setiap kali kita berbicara tentang konkurensi, kita pasti berbicara tentang serangkaian thread yang berjalan secara bersamaan di komputer. Jika terdapat beberapa prosesor atau prosesor multi-inti pada komputer ini, maka komputer tersebut sebenarnya "berjalan secara bersamaan"; namun, jika komputer tersebut hanya memiliki satu prosesor inti, maka "berjalan secara bersamaan" hanyalah penampakan belaka.
Semua sistem operasi modern mendukung pelaksanaan tugas secara bersamaan. Anda dapat mendengarkan musik dan membaca berita online tanpa menunda email pertama. Kita dapat mengatakan bahwa konkurensi ini adalah konkurensi tingkat proses. Di dalam prosesnya, saya juga dapat melihat bahwa ada banyak tugas yang bersamaan. Kami menyebut tugas-tugas bersamaan yang berjalan dalam suatu proses sebagai thread.
Konsep umum lainnya yang terkait dengan konkurensi adalah paralelisme. Ada beberapa perbedaan dan beberapa hubungan antara konkurensi dan paralelisme. Beberapa pemrogram (Penulis, ditransliterasikan sebagai "pemrogram") percaya bahwa menjalankan aplikasi dengan banyak utas pada prosesor inti tunggal adalah konkurensi, dan Anda juga dapat mengamati eksekusi pemrogram, ketika program Anda berjalan dengan banyak utas, Saat utas berjalan pada beberapa prosesor atau prosesor multi-core, keduanya paralel. Ada juga beberapa programmer yang berpikir bahwa jika thread aplikasi tidak dijalankan dalam urutan yang telah ditentukan, maka itu adalah konkurensi; untuk menyederhanakan solusi masalah, thread digunakan, dan thread ini dieksekusi dalam urutan tertentu ini adalah paralelisme.
Bab ini akan menggunakan dua belas contoh untuk mendemonstrasikan cara menggunakan Java7 API untuk melakukan beberapa operasi thread dasar. Anda akan dapat melihat, dalam program Java, cara membuat dan menjalankan thread, cara mengontrol eksekusi thread, cara memanipulasi sekelompok thread sebagai satu unit, dll.
Di bagian ini, kita akan mempelajari cara membuat thread di program Java dan cara menjalankannya. Dalam program Java, semuanya adalah sebuah Objek, begitu pula thread. Ada dua cara untuk membuat thread:
1. Mewarisi kelas Thread dan mengganti metode run();
2. Buat kelas yang mengimplementasikan antarmuka Runnable, lalu buat objek kelas Thread, lalu teruskan instance kelas yang mengimplementasikan antarmuka Runnable sebagai parameter ke instance kelas Thread.
Di bagian ini, kita akan menggunakan metode kedua untuk membuat sepuluh thread dan menjalankannya. Setiap utas menghitung dan mencetak produk dari dua bilangan bulat dalam sepuluh.
mengetahuinya
Ikuti langkah-langkah yang dijelaskan di bawah ini untuk menerapkan contoh ini:
1. Buat kelas bernama Kalkulator dan implementasikan antarmuka Runnable. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
Kalkulator kelas publik mengimplementasikan Runnable {
2. Deklarasikan atribut integer privat bernama number, dan implementasikan konstruktor kelas ini untuk menginisialisasi atribut yang baru saja dideklarasikan. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
nomor int pribadi;
Kalkulator publik(angka int) {
this.number = angka;
}
3. Mengimplementasikan metode run() yaitu program (instruksi) yang dijalankan ketika thread yang kita buat dieksekusi, sehingga metode ini digunakan untuk menghitung tabel perkalian. Kode spesifiknya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
@Mengesampingkan
menjalankan kekosongan publik() {
untuk (int saya = 0; saya < 10; saya++) {
Sistem.keluar.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName(),
nomor, saya, saya * nomor);
}
}
4. Sekarang saatnya mengimplementasikan kelas utama dari contoh aplikasi. Buat kelas bernama Main dan tambahkan metode utama di kelas tersebut. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
kelas publik Utama {
public static void main(String[] args) {
5. Di dalam metode main(), buat perulangan for yang melintasi sepuluh kali. Di badan perulangan, buat kalkulator objek dari kelas Kalkulator, buat utas objek dari kelas Thread, dan teruskan kalkulator sebagai parameter kelas. konstruktor ke pernyataan inisialisasi. Terakhir, panggil metode start() dari objek thread. Kodenya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
untuk (int saya = 0; saya < 10; saya++) {
Kalkulator kalkulator = Kalkulator baru(i);
Thread thread = Thread baru (kalkulator);
thread.mulai();
}
6. Jalankan program ini untuk melihat bagaimana berbagai thread dijalankan secara bersamaan.
tahu kenapa
Berikut ini adalah potongan output yang tercetak di konsol saat menjalankan program. Kita dapat melihat bahwa semua thread yang kita buat dijalankan secara bersamaan.
Copy kode kodenya sebagai berikut:
Benang-3: 3*5 = 15
Utas-0: 0 * 2 = 0
Benang-3: 3*6 = 18
Utas-1: 1 * 6 = 6
Benang-1: 1*7 = 7
Benang-3: 3*7 = 21
Benang-3: 3*8 = 24
Utas-0: 0 * 3 = 0
Utas-0: 0 * 4 = 0
Benang-3: 3*9 = 27
Benang-1: 1*8 = 8
Semua program Java menjalankan setidaknya satu thread. Saat kita menjalankan program Java, Java Virtual Machine (selanjutnya disebut JVM) akan menjalankan thread dan memanggil program yang berisi metode main().
Ketika metode start() dari objek Thread dipanggil, thread lain dibuat. Berapa kali metode start() dipanggil, berapa banyak thread yang akan dibuat.
Ketika semua thread telah menyelesaikan eksekusi, program Java akan berhenti. (Kecuali dalam keadaan khusus, semua thread non-daemon dieksekusi.) Ketika thread awal (seperti thread yang mengeksekusi metode main()) berakhir, thread yang tersisa akan terus dieksekusi hingga tugas komputasi selesai. Ketika salah satu thread memanggil System.exit(), meminta JVM untuk menghentikan program, semua thread menghentikan eksekusinya.
Ketika metode run() dari objek Thread dipanggil, thread tidak akan dibuat, demikian pula ketika metode run() dari kelas yang mengimplementasikan antarmuka Runnable dipanggil, thread tidak akan dibuat. Sebuah thread dibuat hanya ketika metode start() dari objek Thread dipanggil.
tidak pernah berakhir
Seperti disebutkan di awal bagian ini, ada cara lain untuk membuat thread: mewarisi kelas Thread dan mengganti metode run(). Dengan cara ini, Anda dapat membuat objek subkelas Thread dan kemudian memanggil start(). metode objek. Buat utas.
Copy kode kodenya sebagai berikut:
Karena saya sedang mempersiapkan wawancara, saya menemukan banyak informasi tentang Java multi-threading, termasuk "Buku Masak Konkurensi Java 7" ini. Penjelasannya sangat sederhana dan mudah dipahami. Sangat cocok untuk teman-teman yang belum mengetahuinya banyak tentang multi-threading tetapi ingin mempelajarinya dengan serius. Setelah mencari, saya tidak dapat menemukan versi China, jadi saya memutuskan untuk membuat sendiri makanan dan pakaian yang cukup. Oleh karena itu, kami berencana untuk menerbitkan terjemahan tidak resmi, dan judul sementara diberi judul "Koleksi Contoh Konkurensi Java7".
Gunakan doktrin
Artikel ini diterjemahkan dari "Buku Masak Konkurensi Java 7" (D Gua Ge mencurinya sebagai "Koleksi Contoh Konkurensi Java7") dan hanya digunakan sebagai bahan pembelajaran. Ini tidak boleh digunakan untuk tujuan komersial apa pun tanpa izin.
Keberhasilan kecil
Buku aslinya tidak memiliki kode lengkap, sehingga tidak nyaman untuk dilihat. Oleh karena itu, Saudara D Gua menambahkan bagian untuk menampilkan versi lengkap dari kode yang ditampilkan di bagian ini.
Kode lengkap kelas Kalkulator adalah sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* Tanggal: 13-09-2013
* Waktu: 21:42
*/
Kalkulator kelas publik mengimplementasikan Runnable {
nomor int pribadi;
Kalkulator publik(angka int) {
this.number = angka;
}
@Mengesampingkan
menjalankan kekosongan publik() {
untuk (int saya = 0; saya < 10; saya++) {
Sistem.keluar.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName(),
nomor, saya, saya * nomor);
}
}
}
Kode lengkap kelas Utama
Copy kode kodenya sebagai berikut:
paket com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* Tanggal: 13-09-2013
* Waktu: 19:46
*/
kelas publik Utama {
public static void main(String[] args) {
untuk (int saya = 0; saya < 10; saya++) {
Kalkulator kalkulator = Kalkulator baru(i);
Thread thread = Thread baru (kalkulator);
thread.mulai();
}
}
}