Thread didefinisikan sebagai jalur eksekusi suatu program. Setiap thread mendefinisikan kontrol aliran yang unik. Jika aplikasi Anda melibatkan operasi yang kompleks dan memakan waktu, seperti akses database atau beberapa operasi I/O yang intens, maka sering kali akan sangat bermanfaat untuk menyiapkan jalur atau thread eksekusi yang berbeda, setiap thread menjalankan pekerjaan tertentu.
Utas adalah proses yang ringan. Contoh umum penggunaan thread adalah implementasi pemrograman paralel dalam sistem operasi modern. Penggunaan thread menghemat hilangnya siklus CPU dan meningkatkan efisiensi aplikasi.
Program yang telah kami kompilasi sejauh ini berjalan sebagai satu proses pada sebuah thread, yang merupakan instance aplikasi yang sedang berjalan. Namun, aplikasi semacam itu hanya dapat melakukan satu pekerjaan dalam satu waktu. Untuk menjalankan beberapa tugas sekaligus, Anda dapat memecahnya menjadi rangkaian yang lebih kecil.
Di .Net, thread ditangani melalui namespace 'System.Threading'. Membuat variabel bertipe system.threading.thread memungkinkan Anda membuat thread baru dan mulai mengerjakannya. Ini memungkinkan Anda membuat dan mengakses thread independen di thread terpisah.
Sebuah thread dibuat dari objek thread, dan konstruktornya diberikan referensi untuk memulai thread.
Ancaman anak ThreadStart = ThreadStart baru(panggilan thread anak);
Siklus hidup thread dimulai ketika objek kelas system.threading.thread dibuat dan berakhir ketika thread dihentikan atau eksekusi selesai.
Berikut ini adalah berbagai keadaan dalam siklus hidup sebuah thread:
Status mulai tertunda: Contoh thread telah dibuat tetapi metode startup belum dipanggil.
Status siap: Situasi ketika thread siap dieksekusi dan menunggu siklus CPU.
Unrunnable state: Ketika sebuah thread tidak dapat dijalankan, ada beberapa kemungkinan:
Metode tidur saat ini disebut
Metode menunggu disebut
Diblokir oleh operasi I/O
Status kematian: Thread telah menyelesaikan eksekusi atau telah dihentikan.
Atribut prioritas di kelas Thread terutama menentukan prioritas suatu thread relatif terhadap thread lainnya. Runtime .NET memilih thread siap pakai dengan prioritas tertinggi. Prioritas dapat dibagi menjadi:
lebih tinggi dari biasanya
lebih rendah dari biasanya
Paling tinggi
terendah
normal
Setelah thread dibuat, sistem menetapkan prioritasnya menggunakan sistem pengaturan prioritas kelas Thread.
NewThread.Priority = ThreadPriority.Tertinggi;
Kelas thread memiliki beberapa fitur penting berikut:
milik | menggambarkan |
---|---|
Konteks Saat Ini | Dapatkan konten thread yang sedang dijalankan. |
Budaya Saat Ini | Mendapatkan atau menyetel lingkungan thread saat ini. |
Prinsip Saat Ini | Mendapatkan atau menetapkan kebijakan keamanan berbasis peran dari proses saat ini. |
Utas Saat Ini | Dapatkan thread yang sedang berjalan. |
UICulture saat ini | Mendapatkan atau menyetel lingkungan saat ini yang digunakan oleh manajer sumber daya proses yang sedang berjalan untuk menemukan sumber daya tertentu. |
Konteks Eksekusi | Mendapatkan objek ExecutionContext yang berisi informasi kontekstual tentang thread saat ini. |
Hidup | Mendapat nilai yang menunjukkan status eksekusi thread saat ini. |
Adalah Latar Belakang | Latar Belakang Mendapat atau menetapkan nilai yang menunjukkan apakah thread tersebut merupakan thread latar belakang. |
IsThreadPoolThread | Mendapatkan nilai yang menunjukkan apakah thread tersebut termasuk dalam kumpulan thread terkelola. |
Id Utas Terkelola | Mendapatkan pengidentifikasi unik terkini dari thread yang dikelola. |
Nama | Mendapatkan atau menetapkan nama thread. |
Prioritas | Mendapatkan atau menetapkan nilai yang menunjukkan prioritas penjadwalan suatu thread. |
Status Utas | Mendapat nilai yang berisi status thread saat ini. |
Kelas thread memiliki metode penting berikut:
metode | menggambarkan |
---|---|
Menggugurkan | Memanggil ThreadAbortException memulai proses penghentian thread. Memanggil metode ini biasanya mengakhiri thread. |
AlokasiDataSlot | Semua thread diberi slot data yang tidak disebutkan namanya. Untuk performa yang lebih baik, gunakan kolom yang ditandai dengan atribut ThreadStaticAttribute. |
AlokasikanNamedDataSlot | Alokasikan slot data bernama ke semua thread. Untuk performa yang lebih baik, gunakan kolom yang ditandai dengan atribut ThreadStaticAttribute. |
MulaiWilayah Kritis | Memberi tahu host bahwa eksekusi akan memasuki wilayah kode di mana efek pembatalan thread atau pengecualian yang tidak tertangani dapat membahayakan tugas lainnya. |
MulaiThreadAffinity | Memberi tahu host bahwa kode terkelola akan segera dieksekusi, bergantung pada identitas thread sistem operasi fisik saat ini. |
Wilayah Kritis Akhir | Memberi tahu host bahwa eksekusi akan memasuki wilayah kode tempat thread dibatalkan atau pengecualian yang tidak tertangani hanya memengaruhi tugas saat ini. |
Afinitas Utas Akhir | Memberi tahu host bahwa eksekusi kode terkelola telah selesai, bergantung pada identitas thread sistem operasi fisik saat ini. |
Slot Data Bernama Gratis | Menghilangkan kaitan antara nama dan slot untuk semua thread dalam proses. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute. |
DapatkanData | Mengambil nilai dari slot yang ditentukan oleh thread saat ini di domain saat ini dari thread saat ini. Untuk performa yang lebih baik, gunakan kolom yang ditandai dengan atribut ThreadStaticAttribute. |
Dapatkan Domain | Mengembalikan thread yang sedang dijalankan di domain saat ini. |
DapatkanDomainID | Mengembalikan pengidentifikasi domain aplikasi unik. |
DapatkanNamedDataSlot | Temukan slot data bernama. Untuk performa yang lebih baik, gunakan kolom yang ditandai dengan atribut ThreadStaticAttribute. |
Mengganggu | Interupsi thread dalam status thread WaitSleepJoin. |
Bergabung | Memblokir thread pemanggil hingga salah satu thread berakhir, sambil melanjutkan eksekusi COM dan SendMessage standar. Metode ini memiliki bentuk kelebihan beban yang berbeda-beda. |
Penghalang Memori | Akses memori sinkron adalah sebagai berikut: akselerator yang memproses thread saat ini tidak dapat menyusun ulang instruksi sedemikian rupa sehingga akses memori memanggil MemoryBarrier diikuti dengan eksekusi akses memori. |
Atur UlangBatalkan | Membatalkan permintaan pembatalan thread saat ini. |
SetData | Menetapkan data untuk thread yang sedang berjalan pada slot waktu yang ditentukan, dan domain saat ini dari thread tersebut. Untuk kinerja yang lebih baik, domain aplikasi memiliki atribut ThreadStaticAttribute dari domain tersebut. |
Awal | Mulai sebuah thread. |
Tidur | Menyebabkan thread terhenti selama jangka waktu tertentu. |
PutarTunggu | Membuat thread menunggu jumlah iterasi yang ditentukan oleh parameter. |
Bacaan Volatil() | Baca nilai bidangnya. Nilai terbaru ditulis oleh prosesor mana pun di komputer, terlepas dari nomor status cache prosesor atau prosesor. Metode ini memiliki bentuk kelebihan beban yang berbeda-beda. |
Tulisan Volatil() | Segera menulis nilai ke bidang yang terlihat oleh semua prosesor di komputer. Metode ini memiliki bentuk kelebihan beban yang berbeda-beda. |
Menghasilkan | Menyebabkan thread pemanggil mengeksekusi thread lain yang dapat berjalan pada prosesor saat ini, dan sistem operasi memilih untuk mengarahkan ulang thread tersebut |
Contoh berikut mengilustrasikan penggunaan kelas thread. Halaman tersebut memiliki label kontrol yang menampilkan pesan dari thread anak. Pesan dari program utama ditampilkan langsung menggunakan metode respon.write(50), sehingga muncul di bagian atas halaman.
File sumbernya adalah sebagai berikut:
<%@ Halaman Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transisi// ID" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Halaman Tanpa Judul </title> </head> <body> <form id="form1 " runat="server"> <div> <h3>Contoh Utas</h3> </div> <asp:Label ID="lblmessage" runat="server" Text="Label"> </asp:Label> < /bentuk> </tubuh> </html>
Kode latar belakangnya adalah sebagai berikut:
menggunakan Sistem; menggunakan Sistem.Koleksi; menggunakan Sistem.Konfigurasi; menggunakan Sistem.Web.UI menggunakan Sistem.Web.UI.HtmlControls; ; menggunakan System.Web.UI.WebControls; menggunakan System.Web.UI.WebControls.WebParts; menggunakan System.Xml.Linq; menggunakan System.Threading threaddemo { publik parsial kelas _Default : System.Web.UI.Page { protected void Page_Load(pengirim objek, EventArgs e) { ThreadStart childthreat = new ThreadStart(childthreadcall); Thread(childthreat); child.Start(); Response.Write("Tidur utama selama 2 detik....<br/>"); Thread.Sleep(2000); Response.Write("<br/>Thread anak utama yang dibatalkan<br/>"); child.Abort(); } public void childthreadcall() { coba{ lblmessage.Text = "<br/ >Thread anak dimulai <br/>"; lblmessage.Text += "Thread Anak: Menghitung hingga 10"; for( int i =0; i<10; i++) { Thread.Sleep(500); lblmessage.Text += "<br/> di thread Anak </br>"; } lblmessage.Text += "<br/> thread anak selesai"; catch(ThreadAbortException e){ lblmessage.Text += "<br /> thread anak - pengecualian"; "<br /> thread anak - tidak dapat menangkap pengecualian";
Saat halaman dimuat, thread baru dimulai dengan childthreadcall() sebagai referensi. Aktivitas thread utama akan ditampilkan langsung di halaman web.
Thread kedua berjalan dan mengirimkan pesan ke tag kontrol.
Thread utama tidak aktif selama 2000 milidetik saat thread anak dijalankan.
Thread anak terus berjalan hingga diakhiri oleh thread utama, kemudian memunculkan ThreadAbortException dan diakhiri.
Kontrol kembali ke thread utama.
Ketika dijalankan program akan mengirimkan informasi berikut: