2K+ 次查看
对于长时间运行的 Java 代码,其大量使用动态内存,我们最终可能会由于堆空间内存不足而出现内存不足错误。在下面的程序中,我们可以测试程序使用的空闲 Java 堆空间。如果堆空间的使用超过 90%,则显式调用垃圾收集器。System.gc() 调用会阻塞调用线程,直到垃圾收集器完成。因此,此代码可以在单独的线程中执行。示例 public class GCTest { public void runGC() { Runtime runtime ... 阅读更多
6K+ 次查看
SerialVersionUIDSerialVersionUID 必须在 Java 中声明为私有静态最终长变量。此数字由编译器根据类的状态和类属性计算得出。这是 JVM 在从文件读取对象状态时帮助识别对象状态的数字。SerialVersionUID 可用于反序列化期间验证序列化对象的发送方和接收方是否已加载与序列化相关的兼容类。如果反序列化对象与序列化对象不同,则可能会抛出 InvalidClassException。如果 serialVersionUID ... 阅读更多
1K+ 次查看
Java 中的垃圾收集由称为垃圾收集器 (GC) 的守护线程执行。我们可以请求 JVM 运行垃圾收集器,而不是等到 JVM 运行垃圾收集器。无法保证 JVM 是否会接受我们的请求。在 Java 中,我们可以通过两种方式手动调用垃圾收集器使用 System 类使用 Runtime 类使用 System 类System 类具有一个静态方法 gc(),用于请求 JVM 调用垃圾收集器。示例 public class SystemClassTest { public static void main(String[] args){ SystemClassTest test = new SystemClassTest(); ... 阅读更多
3K+ 次查看
invokeLater() 方法是 SwingUtilities 类的静态方法,可用于在 AWT 事件分派线程中异步执行任务。SwingUtilities.invokeLater() 方法的工作原理类似于 SwingUtilities.invokeAndWait(),不同之处在于它将请求放入事件队列并立即返回。invokeLater() 方法不会等待 Runnable 引用的目标中的代码块执行。语法 public static void invokeLater(Runnable target)示例 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class InvokeLaterTest extends Object { private static void print(String msg) { String name = Thread.currentThread().getName(); System.out.println(name + ": " + msg); } ... 阅读更多
5K+ 次查看
sleep() 方法是 Thread 类的静态方法,它使线程休眠/停止工作一段时间。如果线程被其他线程中断,则 sleep() 方法会抛出 InterruptedException,这意味着 Thread.sleep() 方法必须包含在 try 和 catch 块中,或者必须使用 throws 子句指定。每当我们调用 Thread.sleep() 方法时,它都可以与线程调度程序交互,将当前线程置于等待状态一段时间。等待时间结束后,线程从等待状态变为可运行状态。语法 public ... 阅读更多
join() 是 Thread 类的最终方法,可用于将线程执行的开始连接到另一个线程执行的结束,以便线程在另一个线程结束之前不会开始运行。如果在线程实例上调用 join() 方法,则当前正在运行的线程将阻塞,直到线程实例完成执行。语法 public final void join() throws InterruptedException 示例 public class JoinTest extends Thread { public void run() { for(int i=1; i
finalize() 方法是 Object 类中的预定义方法,它是受保护的。可以重写 finalize() 方法的目的,以便在垃圾回收对象之前包含清理代码或处置系统资源。如果我们正在重写 finalize() 方法,那么我们有责任显式调用 finalize() 方法。JVM 或任何给定对象只能调用一次 finalize() 方法。语法 protected void finalize() throws Throwable 示例 public class FinalizeMethodTest { protected void finalize() throws Throwable { try { System.out.println("调用 finalize() 方法 ... 阅读更多
JButton 是 AbstractButton 的子类,可用于向 GUI 应用程序添加与平台无关的按钮。当按下或单击按钮时,JButton 可以生成 ActionListener 接口,它还可以生成 MouseListener 和 KeyListener 接口。我们可以通过覆盖 MouseListener 接口的 mouseEntered() 方法来实现鼠标移到 JButton 上时的翻转效果。语法 void mouseEntered(MouseEvent e)示例 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class RollOverButtonTest extends JFrame { private JButton button; public RollOverButtonTest() { setTitle("RollOverButton 测试"); button = new JButton("翻转按钮"); button.addMouseListener(new MouseAdapter() { ... 阅读更多
在 Java 中,死锁是两个或多个线程永远阻塞的编程情况。死锁条件将至少发生在两个线程和两个或多个资源中。如何避免死锁避免嵌套锁 - 死锁主要发生在我们将锁赋予多个线程时。如果我们已经赋予一个线程锁,则避免将其赋予多个线程。避免不必要的锁 - 我们只能对需要的成员进行加锁。不必要地加锁会导致死锁。使用 Thread.join() - 当一个线程等待另一个线程完成时,会出现死锁条件。如果 ... 阅读更多
12K+ 次查看
yield() 方法是 Thread 类的静态方法,它可以停止当前正在执行的线程,并为具有相同优先级的其他等待线程提供机会。如果碰巧没有等待线程,或者所有等待线程的优先级都较低,则同一线程将继续执行。yield() 方法的优点是获得执行其他等待线程的机会,因此如果我们的当前线程需要更多时间来执行并将处理器分配给其他线程。语法 public static void yield() 示例 class MyThread extends Thread { public void run() { ... 阅读更多