Java kapatma kanca yararlı örnek?
Java uygulaması gerekli adımları sağlam olması için alır emin olmak için çalışıyorum, ve bunun bir parçası düzgün biçimde kapatma içerir. shutdown hooks hakkında okuyorum ve aslında pratikte bunları kullanmak için nasıl anlamıyorum.
Orada pratik bir örnek var mı?
Diyelim ki ben bir çok basit bir uygulama gibi bu bir aşağıda, hangi yazar bir numara, dosya, 10 satır, toplu 100, ve ben istiyorum emin olmak için belirli bir toplu biterse programı yarıda kesti. Kapatma kanca nasıl kayıt altına alıyorum ama benim uygulama içine entegre etmek için nasıl hiçbir fikrim yok. Herhangi bir öneriniz var mı?
package com.example.test.concurrency;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class GracefulShutdownTest1 {
final private int N;
final private File f;
public GracefulShutdownTest1(File f, int N) { this.f=f; this.N = N; }
public void run()
{
PrintWriter pw = null;
try {
FileOutputStream fos = new FileOutputStream(this.f);
pw = new PrintWriter(fos);
for (int i = 0; i < N; i)
writeBatch(pw, i);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
finally
{
pw.close();
}
}
private void writeBatch(PrintWriter pw, int i) {
for (int j = 0; j < 100; j)
{
int k = i*100 j;
pw.write(Integer.toString(k));
if ((j 1) == 0)
pw.write('\n');
else
pw.write(' ');
}
}
static public void main(String[] args)
{
if (args.length < 2)
{
System.out.println("args = [file] [N] "
"where file = output filename, N=batch count");
}
else
{
new GracefulShutdownTest1(
new File(args[0]),
Integer.parseInt(args[1])
).run();
}
}
}
CEVAP
Aşağıdakileri yapabilirsiniz:
- İzin kapatma kanca bazı AtomicBoolean ayarlayın (veya değişken boolean) "keepRunning" yanlış
- (İsteğe bağlı olarak,
.interrupt
Bazı engelleme çağrı veri beklerler eğer çalışma konuları) - Çalışma konuları (sizin durumunuzda
writeBatch
yürütme), çalışma konularıThread.join()
yöntemini çağırarak bitirmesini bekleyin. - Programı sonlandırmak
Sorunlu kod:
static volatile boolean keepRunning = true;
ekleyin() çalıştırındeğiştirin
for (int i = 0; i < N && keepRunning; i) writeBatch(pw, i);
() anaekleyin:
final Thread mainThread = Thread.currentThread(); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { keepRunning = false; mainThread.join(); } });
""Terminal. Control-C vurmak üzerine tüm istemcilerin reddetme nazikçe yapıyorum kabaca.
Sanal makine kapatma sırası başladığında biraz belirtilmemiş sırayla tüm kayıtlı kapatma kanca başlatmak ve onları aynı anda çalıştırmak izin verir.Tüm kancaları tamamlandıktan sonra sonuçlandırılması-çıkış etkinse tüm uninvoked sonlandırıcı çalışır. Son olarak, sanal makine duracaktir.
Yani, kapatma kanca JVM kanca sonlandırdı kadar tutar (döndü() çalıştırın-yöntem.
İçinde döngüler JavaScript kapatma – b...
Java genel tür örnek oluşturmak mı?...
Nasıl tek örnek bir Java uygulaması uy...
Geriye dönük Java sürümleri arasındaki...
Java "-by pass-başvuru" veya...