JavaRush /Blog Jawa /Random-JV /Ngopi #112. Kepiye cara ngumumake, miwiti lan ngulang arr...

Ngopi #112. Kepiye cara ngumumake, miwiti lan ngulang array ing Jawa. Carane mungkasi thread Jawa tanpa nggunakake Thread.stop ()?

Diterbitake ing grup

Kepiye cara ngumumake, miwiti lan ngulang array ing Jawa

Sumber: FreeCodeCamp Ing artikel iki kita bakal ngomong babagan array ing Jawa. Kita bakal ndeleng sawetara conto kanggo mbantu sampeyan ngerti apa array, carane ngumumake, lan carane nggunakake ing kode Jawa. Ngopi #112.  Kepiye cara ngumumake, miwiti lan ngulang array ing Jawa.  Carane mungkasi thread Jawa tanpa nggunakake Thread.stop ()?  - 1

Apa iku array?

Ing Jawa, kita nggunakake array kanggo nyimpen macem-macem nilai saka jinis data sing padha ing variabel siji. Bisa uga dianggep minangka kumpulan nilai saka jinis data sing padha. Iki tegese yen sampeyan arep nyimpen senar ing larik, umpamane, kabeh nilai ing larik sampeyan kudu dadi senar.

Carane ngumumake array ing Jawa

Kita nggunakake kurung kotak [] kanggo wara-wara array . Koyo kui:
String[] names;
Ing kene kita wis ngumumake variabel sing diarani jeneng sing bakal ngemot senar. Yen kita kudu ngumumake variabel kanggo integer (integer), banjur kita bakal nindakake kaya iki:
int[] myIntegers;
Dadi, kanggo nggawe larik, kita nemtokake jinis data sing bakal disimpen ing larik, banjur kurung kothak banjur jeneng larik kasebut.

Carane miwiti array ing Jawa

Kanggo miwiti array tegese menehi nilai menyang array. Ayo miwiti array sing diumumake ing bagean sadurunge:
String[] names = {"John", "Jade", "Love", "Allen"};
int[] myIntegers = {10, 11, 12};
Kita miwiti array kanthi menehi nilai saka jinis data sing padha, misahake saben nilai nganggo koma. Yen kita pengin ngakses unsur / nilai ing array, kita bakal ngakses nomer indeks ing array. Indeks saka unsur pisanan 0. Punika conto:
String[] names = {"John", "Jade", "Love", "Allen"};

System.out.println(names[0]);
// John

System.out.println(names[1]);
// Jade

System.out.println(names[2]);
// Love

System.out.println(names[3]);
// Allen
Saiki kita ngerti carane ngakses saben unsur, ayo ngganti nilai saka unsur katelu.
String[] names = {"John", "Jade", "Love", "Allen"};
names[2] = "Victor";

System.out.println(names[2]);
// Victor
Kita uga bisa mriksa dawa array nggunakake properti dawa . Iki contone:
String[] names = {"John", "Jade", "Love", "Allen"};
System.out.println(names.length);
// 4

Carane iterate liwat array ing Jawa

Kita bisa nggunakake daur ulang kanggo kanggo ngulang unsur-unsur array .
String[] names = {"John", "Jade", "Love", "Allen"};
for (int i = 0; i < names.length; i++) {
  System.out.println(names[i]);
}

// John
// Jade
// Love
// Allen
Daur ulang ing ndhuwur bakal nyithak unsur array kita. Kita nggunakake properti dawa kanggo nemtokake kaping pirang-pirang daur ulang kudu mbukak.

Kesimpulan

Ing artikel iki, kita sinau carane ngumumake lan miwiti array ing kode Jawa. Kita uga weruh carane ngakses saben unsur saka array lan carane daur ulang liwat unsur kasebut. Sugeng coding!

Carane mungkasi thread Jawa tanpa nggunakake Thread.stop ()?

Source: 4comprehension Yen sampeyan lagi maca iki, sampeyan mbokmenawa kepingin weruh apa, lan sing paling penting, carane kanggo mungkasi thread yen sampeyan ora bisa mung gumantung ing Thread#stop() cara, kang wis ora digunakake wiwit Jawa 1.2. ? Ngopi #112.  Kepiye cara ngumumake, miwiti lan ngulang array ing Jawa.  Carane mungkasi thread Jawa tanpa nggunakake Thread.stop ()?  - 2Jawaban singkat yaiku sampeyan kudu nggunakake interupsi amarga Thread#stop ora aman. Nanging yen sampeyan pengin ngerti sebabe, kepiye, lan kanggo apa InterruptedException sing ngganggu , terus maca.

Masalah karo Utas#stop()

Ora ketompo carane intuisi bisa muni, interrupting thread wis mlaku, miwiti lan mungkasi iku rong kasus temen beda. Kenging punapa? Nalika kita miwiti thread anyar, kita miwiti saka ngeruk, kang negara uga ditetepake, nanging nalika kita nyoba kanggo mungkasi thread ana, bisa kelakon ing tengah operasi sing ora bisa langsung diselani . Mbayangno thread nggawe owahan kanggo struktur data thread-aman. Nalika iku ana ing tengah bagean kritis ... banjur thread gaib ilang - kunci dirilis, lan saiki thread liyane bisa mirsani struktur data kiwa ing negara inconsistent. Coba conto ing ngisor iki counter-aman thread karo sawetara negara internal:
class ThreadSafeCounter {

    private volatile int counter = 0;
    private volatile boolean dirty = false;

    public synchronized int incrementAndGet() {
        if (dirty) {
            throw new IllegalStateException("this should never happen");
        }
        dirty = true;
        // ...
        Thread.sleep(5000); // boilerplate not included
        // ...
        counter = counter + 1;
        dirty = false;
        return counter;
    }
}
Nalika sampeyan bisa ndeleng, cara getAndIncrement () nambah counter lan ngganti gendera reged . Kunci mesthekake yen saben thread mlebu getAndIncrement () gendéra reged disetel kanggo false . Saiki ayo nggawe thread lan mandheg kanthi cepet:
var threadSafeCounter = new ThreadSafeCounter();

var t1 = new Thread(() -> {
    while (true) {
        threadSafeCounter.incrementAndGet();
    }
});

t1.start();
Thread.sleep(500);
t1.stop();

threadSafeCounter.incrementAndGet();

// Exception in thread "main" java.lang.IllegalStateException: this should never happen
Saiki conto threadSafeCounter , sanajan wis dileksanakake kanthi bener, rusak permanen amarga thread sing tiba-tiba mandheg. Carane ndandani iku?

Interupsi Utas Koperasi

Tinimbang mungkasi thread, kita kudu gumantung ing interupsi thread koperasi. Cukup, kita kudu njaluk thread kanggo mungkasi dhewe ing wayahe tengen nggunakake Thread#interrupt . Nanging, nelpon Thread#interrupt tinimbang Thread#stop ora cukup. Mandap aman saka utas mung bisa digayuh kanthi nggunakake interupsi utas sing dienggo bareng, sing tegese ing thread kita kudu nangani sinyal interupsi, sing ana ing rong jinis:
  • Boolean diselani flag

  • InterruptedException

Penanganan Flag Interruptible

Nalika ana ing thread, kita bisa mriksa manawa wis diselani kanthi nelpon salah sawijining cara:
Thread.currentThread().isInterrupted(); // reads the interrupted flag
Thread.interrupted(); // reads and resets the interrupted flag
Amarga ora ana cara universal kanggo nangani interupsi, kita kudu ngetrapake tumindak sing cocog karo konteks kita. Ing conto saka bagean sadurunge, thread nambah counter kita ing daur ulang tanpa wates. Tinimbang mandheg langsung, kita mung bisa ngenteni thread kanggo ngrampungake karya munggah lan banjur metu saka daur ulang:
var threadSafeCounter = new ThreadSafeCounter();

var t1 = new Thread(() -> {
    while (!Thread.interrupted()) {
        threadSafeCounter.incrementAndGet();
    }
});

t1.start();
Thread.sleep(500);
t1.interrupt();

threadSafeCounter.incrementAndGet();
Saiki benang kasebut mandheg kanthi aman ing wektu sing tepat tanpa nyebabake kekacauan.

Nangani InterruptedException

Apa sing kedadeyan yen kita nyoba ngganggu thread nunggu? Mesthi, kita ora bisa njupuk gendéra gangguan amarga thread sibuk karo operasi pamblokiran. Pramila InterruptedException ana . Iki ora pangecualian standar, nanging wangun sinyal interrupting beda sing ana mung kanggo nangani ngalangi interrupts! Kaya Thread#interrupted , iku ngreset gendera gangguan . Ayo ngganti conto ing ndhuwur maneh lan ngenalake jeda sadurunge saben kenaikan. Saiki kita kudu nangani InterruptedException sing dibuwang dening Thread#sleep :
var threadSafeCounter = new ThreadSafeCounter();

var t1 = new Thread(() -> {
    while (!Thread.interrupted()) {
        threadSafeCounter.incrementAndGet();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            break;
        }
    }
});

t1.start();
Thread.sleep(500);
t1.interrupt();

assertThat(threadSafeCounter.incrementAndGet()).isGreaterThan(0);
Ing kasus kita, cukup mung metu saka daur ulang. Nanging apa yen sampeyan ora mikir yen cara tartamtu kudu tanggung jawab kanggo nangani interrupts? apa yen tandha cara ora bisa diganti? Ing kasus iki, kita kudu mulihake gendéra gangguan lan / utawa repackage pangecualian, contone:
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    throw new RuntimeException(e);
}

Kesimpulan:

  • Utas#stop ora diilangi tanpa sebab - pancen ora aman.

  • Utas mandheg liwat interupsi - sinyal sing diinterpretasikake dening benang kasebut dhewe.

  • InterruptedException dudu pangecualian biasa - iku cara sing dibangun ing Jawa kanggo menehi tandha yen thread wis diselani.

  • Thread.currentThread ().isInterrupted () lan Thread.interrupted () ora bab sing padha. Sing pisanan mung maca gendera gangguan , lan sing liyane ngreset maneh.

  • Ora ana cara universal kanggo nangani sinyal interupsi - "iku gumantung saka kahanan."

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION