"Merhaba Amigo! Yeni ve çok zor bir konumuz var. Üzgünüm. Bu genellikle yalnızca Java'da değil, genel olarak programlamada da en karmaşık konulardan biri olarak kabul edilir. Multithreading'den bahsediyorum. "

Tipik bir bilgisayar oyunu düşünün, örneğin bir uzay gemisi yarış oyunu. Evrenin enginliğinde uçuyor, meteorlardan ve devriye kruvazörlerinden kaçıyorsunuz. Bu yasa dışı yarışlara sizinle birlikte iki düzine kişi daha katılıyor.

Diyelim ki böyle bir oyun yazmaya karar verdiniz. Programınız komutları (klavye girişi) takip etmeli, uzay gemilerini hareket ettirmeli, yörüngelerini hesaplamalı, herhangi bir çarpışmanın sonuçlarını belirlemeli ve tüm bunları kullanıcının ekranına çizmelidir. Bu çok karmaşık bir iş.

Büyüyen nakliye şirketiyle ilgili örnekte "büyük karmaşıklık sorununu" nasıl çözdüğümüzü hatırlıyor musunuz?

Bunu bağımsız bölümlere ayırdık ve nasıl etkileşim kurabileceklerini katı bir şekilde belirledik (standartlaştırdık).

"Ama bağımsız bölümler diğer bölümlerle paralel olarak bazı işler yapmak zorunda kaldığında ne yapacağız?! Bu sorunun cevabı iş parçacığıdır . "

Bir programı , kod etrafında çalışan ve komutları yürüten küçük bir robot olarak hayal etmeye çalışın . Önce bir satırda bir komut yürütür, ardından bir sonraki satıra geçer ve bu böyle devam eder.

"Aklımda görebiliyorum. Çocuk oyuncağı!"

"Çok iyi. Şimdi bu robotlardan birkaçına sahip olduğunuzu hayal edin. Biri kullanıcı girişini işlerken, ikincisi bu girdiye dayalı olarak nesneleri güncelliyor. Üçüncüsü bu nesneleri ekranda görüntülemek için kodu çalıştırıyor. Saniyede birkaç kez, dördüncüsü herhangi bir geminin çarpışıp çarpışmadığını kontrol eder ve çarpışmışsa çarpışmanın sonuçlarını hesaplar."

Böylece programı sadece bağımsız parçalara/nesnelere bölmekle kalmıyor, aynı zamanda bu parçaların birbirinden bağımsız olarak da işlerini yapabilmelerini sağlıyoruz. Bireysel parçalar arasındaki etkileşim ne kadar azsa, program o kadar az karmaşıktır.

Yöneticiyi mektup gönderen bir komut dosyasıyla değiştirebildiğinizi hayal edin . Ve diğer şirket departmanları bir değişiklik olduğunu bile söyleyemediler. Bu tür şeyler, 26. yüzyılda mükemmel sonuçlarla gerçekleşti. Çoğu yönetici ve hatta üst düzey yöneticiler, ortalama karmaşıklığa sahip bir senaryo ile başarılı bir şekilde değiştirilebilir. Yöneticilerin kitlesel işten çıkarılması ancak «ofis plankton sendikası» müdahale ettikten sonra sona erdi. Ama konudan sapıyorum.

"Ne kadar ilginç!"

"Kod yürüten bu "küçük robotlardan" birkaç tane olmakla kalmaz, aynı zamanda birbirleriyle iletişim kurabilir ve yeni robotlar üretebilirler."

"Yeni robotlar mı üreteceksin?"

"Evet, yeni görevler gerçekleştirmek için. Bazen mevcut iş parçacığı (robot) ile aynı anda bazı eylemler gerçekleştirmek için başka bir robot (başka bir iş parçacığı) oluşturmak avantajlıdır."

" Bu kulağa iyi bir şey gibi geliyor ama onu nerede kullanacağımı bilemiyorum. "

Ve neden onlara « iplik » diyoruz ?

"Her robotun farklı bir renk olduğunu ve komutları yerine getirirken kendi rengiyle işaretlediğini hayal edin. Küçük robotun izlediği yol, bir kalemin bıraktığı çizgi gibidir. Bu yol, robotun arkasından bir ip gibi uzanır . bir iğne."

Her «küçük robotun» yerine getirmek için yaratıldığı bir görevi vardır. Bir iş parçacığını, bu görevi gerçekleştirirken yürütülen komutlar kümesi olarak düşünebilirsiniz.

Diyelim ki kargo teslim etmek için bir uzay gemisinde uçuyorsunuz. O zaman «kargo teslim» sizin görevinizdir ve onu gerçekleştirmenin tam ortasındasınız. Ve uçuş yolunuz sizin ipinizdir. Her yeni görevin, henüz tamamlanmamış her görevin kendi iş parçacığına (hala kat edilmesi gereken bir yol) sahip olduğunu söyleyebiliriz.

"Yani bir görev ve onu yürüten bir "küçük robot" vardır. Ve bir iş parçacığı, robotun görevini tamamlarken izlediği yoldur, değil mi?

"Kesinlikle."

Her şey derinlerde böyle çalışır. Bilgisayarın yalnızca bir işlemcisi olduğundan, aynı anda yalnızca bir komut yürütebilir. İşte olan şey: işlemci sürekli olarak iş parçacıkları arasında geçiş yapar. Yeni bir iş parçacığına geçer, birkaç komut yürütür, ardından bir sonraki iş parçacığına geçer, birkaç komut yürütür ve böyle devam eder. Ancak threadler arasında geçiş saniyede yüzlerce kez gerçekleştiğinden, bize bütün threadler aynı anda çalışıyormuş gibi geliyor.

Çoklu iş parçacığı - 1