Saya mencoba memastikan aplikasi Java saya mengambil langkah-langkah yang wajar untuk menjadi kuat, dan bagian dari itu melibatkan mematikan dengan anggun. Saya membaca tentang shutdown hook dan saya tidak benar-benar mengerti bagaimana memanfaatkannya dalam praktik.
Apakah ada contoh praktis di luar sana?
Katakanlah saya memiliki aplikasi yang sangat sederhana seperti ini di bawah, yang menulis angka ke sebuah file, 10 ke sebuah baris, dalam batch 100, dan saya ingin memastikan batch tertentu selesai jika programnya terputus. Saya mendapatkan cara mendaftarkan hook shutdown tetapi saya tidak tahu bagaimana mengintegrasikannya ke dalam aplikasi saya. Ada saran?
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)%10 == 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();
}
}
}
java
shutdown-hook
Jason S
sumber
sumber
Jawaban:
Anda dapat melakukan hal berikut:
.interrupt
thread yang berfungsi jika menunggu data di beberapa panggilan pemblokiran)writeBatch
dalam kasus Anda) selesai, dengan memanggilThread.join()
metode pada thread yang berfungsi.Beberapa kode samar:
static volatile boolean keepRunning = true;
Dalam run () Anda berubah menjadi
Di main () Anda menambahkan:
Begitulah kira-kira bagaimana saya melakukan "tolak semua klien setelah menekan Control-C" di terminal.
Dari dokumen :
Artinya, hook shutdown membuat JVM tetap berjalan sampai hook dihentikan (dikembalikan dari run () -method.
sumber
mainThread
adalah utas daemon, makajoin
jaminan bahwa kami menunggu sampai selesai sebelum membiarkan JVM dimatikan.Shutdown Hooks adalah utas yang belum dimulai yang terdaftar dengan Runtime.addShutdownHook (). JVM tidak memberikan jaminan apa pun atas urutan dimulainya hook shutdown. Untuk info lebih lanjut lihat http://techno-terminal.blogspot.in/2015/08 /shutdown-hooks.html
sumber