Muhabir: Temel java nasıl? Çok iş parçacıklı okuma mutlaka çok iş parçacıklı güvenlik sorunlarına neden olur mu?

Java temeli, iş parçacığı ve çoklu iş parçacığı gibi Android öğrenmek için çok önemlidir. Android geliştirme yaparken yüksek eşzamanlılığın ileri sorunlarını incelememiz gerekmeyebilir, ancak özellikle durumun neden böyle olduğunu anlamak için temel bilgilere hakim olmamız gerekiyor? Ve kullanım senaryoları. Bu makale, temelleri açıklamak için temel olarak düzenli mülakat sorularıyla birleştirilmiştir. Şimdi çok temel bazı mülakat sorularına bakalım.

  • İş parçacığı uygulamak için kaç yol var?
  • İş parçacığı nasıl başlatılır? Run () ve start () arasındaki fark.
  • Hangi koşullar altında iş parçacığı güvenliği sorunları ortaya çıkacak?
  • İplik güvenliği sorunu nasıl çözülür?
  • Yukarıdaki sorular internette aranır.Belki daha detaylı sorabilirsiniz.Örneğin, birden fazla konu açıldığında, aynı anda çalışıyorlar mı? Başka bir örnek olarak, çoklu okuma zorunlu olarak iş parçacığı güvenliği sorunlarına neden olur mu? Çoklu okumayı anladığınız sürece, görüşmeci ne sorarsa cevap verebilirsiniz.

    Çok iş parçacıklı kullanım senaryoları

    Oyun oynamak ve bilet satmak gibi birçok uygulama senaryosu vardır. Bir oyun oynarken rakip size vurursa, hamle yapmadan önce size vurmasını bitirmesini beklemelisiniz Bu tür şeylere dayanabilir misiniz? Dakikalar içinde patlayacak. Şu anda, birden çok konu kullanmanız gerekiyor ve aynı anda fikir tartışması heyecan verici. Ayrıca Bahar Şenliği sırasında genellikle birden çok pencerede bilet satıyoruz, binlerce insan yüzlerce bilet kapıyor.

    İş parçacığı uygulama yolları

    İş parçacıkları uygulamanın genellikle 2 yolu vardır

    İlk yol, Thread'ı miras almaktır

    public class Thread1, Konu { @Override public void run () { super.run (); for (int i = 0; i < 1000; i ++) { Log.i ("iş parçacığı", "i ======" + i); } } }

    İkinci yol, Runnable arayüzünü uygulamaktır

    public class Thread2, Runnable { @Override public void run () { for (int j = 0; j < 1000; j ++) { Log.i ("iş parçacığı", "j --------------------------" + j); } } }

    İleti dizisini başlat

    Şimdi yukarıdaki iki iş parçacığını başlatmak için start () çağırın

    public class TestActivity, Aktiviteyi genişletir { @Override korumalı void onCreate (@Nullable Bundle registeredInstanceState) { super.onCreate (SavedInstanceState); Thread1 thread1 = yeni Thread1 (); thread1.start (); Thread thread2 = yeni Thread (yeni Thread2 ()); thread2.start (); } }

    Api belgelerine bakarak, start () yönteminin iş parçacığını başlatmak olduğunu biliyorum. Çalıştırdıktan sonra basılı içeriğe bakın.

    Resmin çok uzun olduğunu düşünürsek sadece bir kısmını kestim.Gerçek durum, başlangıçta tüm i'nin basılması ve j'nin i = 130'a kadar basılmaması ve bir süre j basıldıktan sonra i basılmasıdır. Aynı anda açın, nedene göre sırayla i ve j yazdırmalı mı? İki iş parçacığının aslında aynı anda çalıştırılmadığı ortaya çıktı. Bu, CPU'nun zaman çizelgelemesini içerir.Tread1 ve Tread2 iki görevdir.Tek çekirdekli bir CPU'yu örnek olarak ele alırsak, bu süreci basitçe aşağıdaki şekilde özetledim.

    İşlemci, ilk önce yürütmek için Görev1'e 1 ms ayırabilir, ardından yürütmek için Görev2'ye 2 ms ayırabilir ve ardından yürütmek için Görev1'e 10 ms tahsis edebilir ve bu böyle devam eder. Bu nedenle, cpu iki iş parçacığını aynı anda işlemez, ancak aynı zaman periyodunda dönüşümlü olarak çalışır, ancak işlemin çok hızlı olması ve ms cinsinden hesaplamanın daha da hızlı olması nedeniyle, iki görevin aynı anda yürütüldüğünü hisseder. (CPU tahsis süresini tahmin edemiyoruz, bu sadece istediğim zaman aldığım süre)

    Start () değerini run () çağırmak için değiştirin

    public class TestActivity, Aktiviteyi genişletir { @Override korumalı void onCreate (@Nullable Bundle registeredInstanceState) { super.onCreate (SavedInstanceState); Thread1 thread1 = yeni Thread1 (); thread1.run (); Thread thread2 = yeni Thread (yeni Thread2 ()); thread2.run (); } }

    Çalıştırdıktan sonra baskı sonucu aşağıdaki gibidir

    Sadece bir kısmını kestim. Asıl durum, i'yi yazdırdıktan sonra j yazdırmanın başlamasıdır.Bu, thread1.run (); yürütüldükten sonra, thread2.run (); çalıştırıldığı anlamına gelir.Bu tamamen sıralıdır. İçeriği ilgili çalıştırma yönteminde yürütün. Run yönteminin çağrılması iş parçacığını başlatmak değil, çalıştırmadaki içeriği yürütmek ve start () iş parçacığını başlatmaktır.

    Çoklu okumaya ne olabilir?

    Örnek olarak çok pencereli bilet satışlarını ele alırsak, 200 bilet satan 3 pencere olduğunu ve her bir pencerede sırada 1000 kişi olduğunu varsayalım.

    Önce basit bir bilet sistemi yazın.

    // Tren bilet sistemi public class TicketSystem, Runnable { public static int ticketNum = 200; @Override public void run () { for (int i = 1; i < = 1000; i ++) {// 1. Adım 1ms eğer (ticketNum > 0) {// 2. Adım 2 ms Deneyin { Thread.sleep (50); // İlgili bilgilerin girilmesi gerekiyor, bu zaman alıyor ve bu sadece biletlerin bu kadar çabuk alınamayacağı bir varsayım. 3. Adım 50 ms } catch (InterruptedException e) { e.printStackTrace (); } ticketNum -; System.out.println ("Tebrikler, bileti başarıyla aldınız, ancak hala var:" + ticketNum + "ticket"); } } } }

    Yukarıdaki kodun anlaşılması kolaydır, bu yüzden çok fazla açıklamayacağım.Aşağıda tanıtılacak olan yukarıdaki anlaşılmaz yorumları görmezden gelebilirsiniz. Biletleri almak için 3 pencere açın

    public class TestActivity, Aktiviteyi genişletir { @Override korumalı void onCreate (@Nullable Bundle registeredInstanceState) { super.onCreate (SavedInstanceState); TicketSystem ts = new TicketSystem (); // 3 pencere oluştur Konu dişi1 = yeni Konu (ts); Diş dişi2 = yeni Konu (ts); İplik dişi3 = yeni Konu (ts); thread1.start (); thread2.start (); thread3.start (); }}

    Çalıştırdıktan sonra, yazdırma sonuçlarına bakın ve bazı yazdırma sonuçlarına müdahale edin.

    İki kez, tek bir bilet kaldı ve hala negatif biletler kaldı.Bu, birden fazla iş parçacığından kaynaklanabilecek eşzamanlılık sorunudur. Üç pencere üç iş parçacığıdır ve üç iş parçacığı aynı anda açılır. Yukarıdaki bölümde bahsedildiği gibi, cpu bu görevleri zaman çizelgeleme yoluyla dönüşümlü olarak gerçekleştirir. Adım 1'deki for döngüsünün 1 ms yürütmesi gerektiğini, adım 2'deki if koşulu karar ifadesinin 2 ms yürütmesi gerektiğini ve adım 3'teki satın alma işleminin 50 ms'ye ihtiyacı olduğunu varsayın. Son bilet kaldığında, iş parçacığı1'e ayrılan süre 2 ms'dir ve if ifadesi henüz yürütülmüştür, bu sırada ticketNum hala 1'dir ve ardından iş parçacığı2'ye geçildiğinde, bilet satın alma işlemi gerçekleştirildikten hemen sonra ayrılan süre 54 ms'dir. Şu anda ticketNum zaten 0'dır, ancak evre1 tekrar çalıştırıldığında, daha önce if deyimini girmiştir ve kalan kod çalıştırılacaktır ve ticketNum -1'dir. Aynı durum diğer durumlar için de geçerlidir. İşlemci tarafından ayrılan zaman bizim kontrolümüz dışındadır ve üç iş parçacığı aynı anda aynı veri biletiNum üzerinde çalışır, bu da anormal sonuçlara yol açar.

    Yazının başında i ve j basıldığında, çoklu iş parçacığı da açıldı ve herhangi bir sorun olmadı. Çok pencereli bilet satışlarında çoklu iş parçacığı etkinleştirildiğinde bir sorun var bu iki örnek arasındaki fark nedir? Aradaki fark, çok pencereli bilet satışlarında yatmaktadır.Çok sayıda iş parçacığı aynı paylaşılan veriye erişmektedir, bu 200 bilettir. İ ve j örneklerinde, iki iş parçacığı tarafından erişilen veriler birbiriyle ilişkili değildir. Bundan biliyoruz ki, çok sayıda iş parçacığı ile iş parçacığı güvenliği sorunlarının kesinlikle ortaya çıkacağı söylenemez.Aynı paylaşılan veriler üzerinde birden çok iş parçacığı çalıştığında, iş parçacığı güvenliği sorunları ortaya çıkacaktır.

    İş parçacığı güvenliği sorunlarını çözün

    Yukarıda bahsedilen birden çok iş parçacığı aynı verileri paylaşır ve iş parçacığı güvenlik sorunları ortaya çıkar. Bu sorunu trende yolcuların tuvalete gitme sorunu olarak düşünebiliriz, bu biraz zevkli bir örnek haha. Vagonun tamamında aynı anda tuvaleti kullanmak isteyen 20 kişi var ama sadece bir tuvalet kullanılabilir, bu tuvaleti paylaşmak zorunda mısınız? 20 kişinin aynı anda tuvalete gitmesi imkansızdır, bu yüzden tuvaleti tasarlarken kilitlenecektir.Bir kişi kapıya girip kilitlediği sürece, dışarıdaki kişi ne kadar endişeli olursa olsun, bir sonraki kişi dışarı çıkmadan önce içerideki kişinin kilidini açmasını beklemelidir. İçeri gir. Programlar da hayattan gelir İş parçacığı güvenliği sorunlarını çözmek için genel çekirdek kısmına bir kilit ekleyebiliriz. kod aşağıdaki gibi gösterilir:

    public class TicketSystem, Runnable { public static int ticketNum = 200; @Override public void run () { for (int i = 1; i < = 1000; i ++) {// 1. Adım 1ms senkronize edildi (TicketSystem.class) { eğer (ticketNum > 0) {// 2. Adım 2 ms Deneyin { Thread.sleep (50); // İlgili bilgilerin girilmesi gerekiyor, bu zaman alıyor ve bu sadece biletlerin bu kadar çabuk alınamayacağı bir varsayım. 3. Adım 50 ms } catch (InterruptedException e) { e.printStackTrace (); } ticketNum -; System.out.println ("Tebrikler, bileti başarıyla aldınız, ancak hala var:" + ticketNum + "ticket"); }} } } }

    Yine sorun olmayacak. Basit hissettiriyor mu? Java dili bu çözümü sağladığından, onu kendimiz uygulamamıza gerek yok. Basit problemler için elimizden gelenin en iyisini yapmaya çalışın Kilitleme, çalışma verimliliğini etkileyecektir Bu nedenle, biz sadece çekirdek kısmı kilitliyoruz. Çekirdek kısım ne kadar ayrıntılı olursa, o kadar iyi, zamandan tasarruf.

    Yazının bu noktasında başta sorulan sorular da cevaplanmış oldu şimdi kısaca cevaplayalım.

    1. İş parçacığı uygulamanın birkaç yolu var mı?

    Thread'ı devralmanın ve Runnable arayüzünü uygulamanın genellikle iki yolu vardır.

    2. Konu nasıl başlatılır? Run () ve start () arasındaki fark.

    Çağrı başlatma (). Çalıştırma çalıştırma (), yürütme yönteminin içeriğidir ve start (), evreyi başlatmaktır.

    3. İplik güvenliği sorunları hangi koşullarda ortaya çıkacaktır?

    Birden fazla iş parçacığı aynı paylaşılan veriler üzerinde çalıştığında.

    4. İplik güvenliği sorunu nasıl çözülür?

    Kilitleyin, ortak çekirdek parçasını kilitleyin.

    Yukarıdakiler sadece kısa bir cevaptır, görüşme yaparken yine de kendi anlayışınızı eklemeniz gerekir. Her görüşme aynıdır, ancak bilgiyi anlayarak sorulara doğru cevap verebilirsiniz.Yanıtı ezberlemek mümkün değildir.

    Çoklu iş parçacığı için bu kadar. Son zamanlarda salgın hala devam ediyor, maskenizi çıkarıp kodu girene kadar birlikte neşelenelim.

    Sonunda

    Son olarak şunu söylemek istiyorum: Programcılar için öğrenilmesi gereken çok fazla bilgi içeriği ve teknoloji var. Çevre tarafından ortadan kaldırılmak istemiyorsanız, kendinizi sürekli geliştirmelisiniz. Bize uyum sağlamak için çevreye değil, her zaman çevreye uyum sağlıyoruz!

    Burada editör, yukarıdaki teknik sistem şemalarıyla ilgili düzinelerce set koleksiyonunu paylaşacaktır. Tencent, Toutiao, Ali, Meituan ve diğer şirketlerden 19 yıl içinde mülakat soruları , Teknik noktaları video ve PDF olarak düzenledi (aslında beklenenden çok daha fazla enerji harcadı), Bilgi bağlamı + birçok ayrıntı , Sınırlı alan nedeniyle, işte resim şeklinde bir parçası.

    ve ayrıca Gelişmiş mimari teknolojisi gelişmiş zihin haritası, Android geliştirme röportajı özel materyalleri , Herkesin ileri seviyeyi geliştirmeyi öğrenmesine yardımcı olmak için gelişmiş gelişmiş çerçeve materyalleri ve ayrıca internette öğrenmek için materyal aramak için herkesin zamanından tasarruf sağlar ve ayrıca birlikte öğrenmek için arkadaşlarla paylaşılabilir.

    Size birçok kazanç getireceğine inanıyorum:

    [Android gelişmiş öğrenme videosu], [Android mülakat hilelerinin tam seti PDF], [Android geliştirme temel bilgi notları] özel mesajla [Android] ücretsiz olarak elde edilebilir!

    Programcı olmak kolaydır. İyi bir programcı olmak sürekli öğrenmeyi gerektirir. Genç programcıdan kıdemli programcıya, küçük mimardan kıdemli mimara veya yönetime, teknik müdürden teknik direktörlüğe kadar her aşamada Farklı yeteneklere hakim olmanız gerekiyor. İşinizde ve yetenek gelişiminizde akranlarınızdan kurtulmak için kariyer yönünüzü erkenden belirleyin.

    "Bir günde röportaj için nasıl hazırlandım ve Tencent teklifini nasıl aldım?"
    önceki
    Yılbaşı tarım ürünleri siparişleri 200 milyonu aştı, Pinduoduo markalı tarım ürünlerini şehirlere ve kırsal alanlara tanıtıyor
    Sonraki
    Didi, 62 tren istasyonunda çevrimiçi araç çağırma için özel toplama noktaları ve kanallar oluşturuyor
    Marka yükseltme ve geliştirme Wanrun Group, 2020'de yeni bir sayfa açıyor
    Yeni Land Rover Discovery Sport neden Discovery ailesinin spor şampiyonu oldu?
    Ağır! Chengdu: İlkokul 13 Nisan'da başlıyor! Lise giriş sınavı orta derecede gecikti
    Uzman ve malzeme gönderen Çin, bunun gibi Asyalı kardeşleri destekliyor
    "Herhangi bir zorlukla karşılaşırsanız, kırmızı yeleği bulun!" - Wanjia'nın ışıklarını kalpleriyle yakarlar
    İlk Gözlem | Genel Sekreter Zhejiang, maske takıp takmayacağını denetledi
    Chongqing kızları ve Wuhan kızlarının uzun bir ilişkisi var: "Babamı sana bağışlıyorum ve dayanmalısın!"
    Eve geri sayım, Chongqing destek ekibinden Xiaogan'a ilk tahliye edilenler havaalanına ulaştı
    Kiler bir kızı cinsel saldırıdan 24 gün hapse attı, Hunan Phoenix "sapık erkek" Long Xihe idama mahkum edildi
    Muhabir: Bana Android'in UI yenileme mekanizmasından bahseder misiniz?
    Büyük bir fabrika ile röportaj için nasıl hazırlanılır? Çevremdeki teknik uzmanlara danıştım ve sonunda cevabı aldım!
    To Top