欢迎访问宙启技术站
智能推送

在Java中如何使用函数实现多线程编程

发布时间:2023-10-06 14:42:46

在Java中,使用函数实现多线程编程主要有两种方式:使用Runnable接口和使用Callable接口。

1. 使用Runnable接口

Runnable接口是一个函数式接口,只包含一个run()方法。要实现多线程,可以创建一个实现了Runnable接口的类,并实现run()方法,在run()方法中编写线程要执行的逻辑。然后,在主线程中,创建一个Thread对象,并将实现了Runnable接口的类的对象作为参数传递给Thread的构造函数,最后调用Thread的start()方法启动线程。

示例代码如下:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码逻辑
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建一个Runnable对象
        MyRunnable myRunnable = new MyRunnable();
        
        // 创建一个Thread对象,并将Runnable对象作为参数传递给Thread的构造函数
        Thread thread = new Thread(myRunnable);
        
        // 启动线程
        thread.start();
        
        // 主线程执行的代码逻辑
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}

上述代码创建了一个实现了Runnable接口的类MyRunnable,并在run()方法中编写了线程要执行的逻辑。然后,在主线程中,创建了一个Thread对象,并将MyRunnable对象作为参数传递给Thread的构造函数。最后,调用Thread的start()方法启动线程。

2. 使用Callable接口

Callable接口是一个泛型接口,可以返回一个结果,并且可以抛出异常。要实现多线程,需要创建一个实现了Callable接口的类,并实现call()方法,在call()方法中编写线程要执行的逻辑,并返回一个结果。然后,在主线程中,创建一个ExecutorService对象,使用submit()方法将实现了Callable接口的类的对象作为参数传递给submit()方法,最后调用ExecutorService的shutdown()方法关闭线程池。

示例代码如下:

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        // 线程执行的代码逻辑
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += i;
        }
        return sum;
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建一个ExecutorService对象
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        
        // 创建一个Callable对象
        MyCallable myCallable = new MyCallable();
        
        // 提交Callable对象到线程池,并返回一个Future对象
        Future<Integer> future = executorService.submit(myCallable);
        
        // 关闭线程池
        executorService.shutdown();
        
        // 主线程执行的代码逻辑
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
        
        // 获取线程执行完毕后的返回结果
        int result = future.get();
        System.out.println("Sum: " + result);
    }
}

上述代码创建了一个实现了Callable接口的类MyCallable,并在call()方法中编写了线程要执行的逻辑,并返回了一个结果。然后,在主线程中,创建了一个ExecutorService对象,并使用submit()方法将MyCallable对象作为参数传递给submit()方法,返回一个Future对象。最后,调用ExecutorService的shutdown()方法关闭线程池,并使用future.get()方法获取线程执行完毕后的返回结果。