Anda dapat menentukan jumlah proses yang tersedia untuk Mesin Virtual Java dengan menggunakan metode runtime statis, availableProcessors . Setelah Anda menentukan jumlah prosesor yang tersedia, buat jumlah utas itu dan bagi pekerjaan Anda sesuai dengan itu.
Pembaruan : Untuk memperjelas lebih lanjut, Thread hanyalah sebuah Objek di Java, jadi Anda dapat membuatnya seperti Anda akan membuat objek lain. Jadi, katakanlah Anda memanggil metode di atas dan menemukan bahwa ia mengembalikan 2 prosesor. Hebat. Sekarang, Anda dapat membuat loop yang menghasilkan Thread baru, dan membagi pekerjaan untuk thread tersebut, dan mengaktifkan thread tersebut. Berikut beberapa psuedocode untuk menunjukkan apa yang saya maksud:
int processors = Runtime.getRuntime().availableProcessors();
for(int i=0; i < processors; i++) {
Thread yourThread = new AThreadYouCreated();
// You may need to pass in parameters depending on what work you are doing and how you setup your thread.
yourThread.start();
}
Untuk informasi lebih lanjut tentang membuat utas Anda sendiri, buka tutorial ini . Juga, Anda mungkin ingin melihat Thread Pooling untuk pembuatan thread.
Anda mungkin ingin melihat framework java.util.concurrent untuk hal ini juga. Sesuatu seperti:
atau
Ini jauh lebih baik daripada mengatasi kumpulan utas Anda sendiri, dll.
sumber
Pilihan 1:
newWorkStealingPool dari
Executors
Dengan API ini, Anda tidak perlu meneruskan jumlah inti ke
ExecutorService
.Implementasi API ini dari grepcode
Pilihan 2:
newFixedThreadPool API dari
Executors
atauother newXXX constructors
, yang mengembalikanExecutorService
ganti nThreads dengan
Runtime.getRuntime().availableProcessors()
Opsi 3:
ThreadPoolExecutor
lulus
Runtime.getRuntime().availableProcessors()
sebagai parameter kemaximumPoolSize
.sumber
Doug Lea (penulis paket bersamaan) memiliki makalah ini yang mungkin relevan: http://gee.cs.oswego.edu/dl/papers/fj.pdf
Kerangka Fork Join telah ditambahkan ke Java SE 7. Berikut adalah beberapa referensi lainnya:
http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html Artikel oleh Brian Goetz
http://www.oracle.com/technetwork/articles/java/fork-join-422606.html
sumber
Cara standarnya adalah metode Runtime.getRuntime (). AvailableProcessors (). Pada kebanyakan CPU standar, Anda akan mengembalikan jumlah utas optimal (yang bukan jumlah inti CPU sebenarnya) di sini. Oleh karena itu, inilah yang Anda cari.
Contoh:
JANGAN lupa untuk mematikan layanan eksekutor seperti ini (atau program Anda tidak akan keluar):
Berikut adalah garis besar singkat cara mengatur kode MT berbasis masa depan (offtopic, untuk ilustrasi):
Kemudian Anda perlu melacak berapa banyak hasil yang Anda harapkan dan mengambilnya seperti ini:
sumber
Di kelas Runtime, ada metode yang disebut availableProcessors (). Anda dapat menggunakannya untuk mengetahui berapa banyak CPU yang Anda miliki. Karena program Anda terikat dengan CPU, Anda mungkin ingin memiliki (paling banyak) satu utas per CPU yang tersedia.
sumber