在Java服务开发中,回调函数是一种强大的设计模式,它允许一个对象在其操作完成时通知另一个对象。这种模式在异步编程中尤其有用,因为它允许程序在等待某个操作完成时继续执行其他任务。以下是回调函数在Java服务中的五大应用场景:

1. 异步任务处理

场景描述: 当服务需要执行一些耗时的任务,如数据库操作、文件IO或网络请求时,使用回调函数可以让这些任务在后台执行,而主线程则可以继续处理其他任务。

代码示例:

public interface AsyncTaskCallback {
    void onComplete();
}

public class LongRunningTask implements AsyncTaskCallback {
    @Override
    public void onComplete() {
        System.out.println("Long running task completed.");
    }

    public void execute() {
        // 模拟耗时操作
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        onComplete();
    }
}

public class Main {
    public static void main(String[] args) {
        LongRunningTask task = new LongRunningTask();
        new Thread(task).start();
        System.out.println("Main thread continues to execute other tasks.");
    }
}

2. 事件监听

场景描述: 在图形用户界面(GUI)开发中,回调函数用于处理用户事件,如按钮点击、鼠标移动等。

代码示例:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EventListenerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Event Listener Example");
        JButton button = new JButton("Click me");

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button clicked!");
            }
        });

        frame.add(button);
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

3. HTTP请求响应

场景描述: 在进行HTTP请求时,使用回调函数可以在响应到达时立即执行相应的处理逻辑,而不需要阻塞主线程。

代码示例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpCallbackExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://example.com/api/data");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request not worked");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 数据库操作

场景描述: 在数据库操作中,回调函数可以用于在查询或更新完成后通知调用者。

代码示例:

public interface DatabaseCallback {
    void onSuccess(String data);
    void onError(String error);
}

public class DatabaseExample {
    public void fetchData(String query, DatabaseCallback callback) {
        // 模拟数据库查询
        String data = "Query results";
        if (data != null) {
            callback.onSuccess(data);
        } else {
            callback.onError("Failed to fetch data");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        DatabaseExample db = new DatabaseExample();
        db.fetchData("SELECT * FROM users", new DatabaseCallback() {
            @Override
            public void onSuccess(String data) {
                System.out.println("Data retrieved: " + data);
            }

            @Override
            public void onError(String error) {
                System.out.println("Error: " + error);
            }
        });
    }
}

5. 流式数据处理

场景描述: 在处理大量数据流时,回调函数可以用于处理每一块数据,而不需要一次性加载所有数据到内存中。

代码示例:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamProcessor {
    public void processStream(InputStream stream, StreamCallback callback) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
            String line;
            while ((line = reader.readLine()) != null) {
                callback.onData(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public interface StreamCallback {
    void onData(String data);
}

public class Main {
    public static void main(String[] args) {
        StreamProcessor processor = new StreamProcessor();
        processor.processStream(System.in, new StreamCallback() {
            @Override
            public void onData(String data) {
                System.out.println("Processing line: " + data);
            }
        });
    }
}

通过这些应用场景,我们可以看到回调函数在Java服务开发中的多样性和实用性。掌握这些场景,可以帮助开发者编写更加高效、响应快速的程序。