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

Java中的多线程函数实现与调用

发布时间:2023-05-21 10:08:03

Java是一门面向对象的编程语言,支持多线程编程。多线程是指同一个程序中有多个控制流同时执行,多个线程并发的执行代码,线程之间相互独立,可以并行执行,提升程序的效率。Java中多线程编程的基础是Thread类,通过创建Thread类的子类对象实现多线程编程。

Java中实现多线程的方法

1. 继承Thread类

继承Thread类需要重写run方法,在run方法中编写线程的代码。使用start方法启动线程。示例代码如下:

public class MyThread extends Thread {

    public void run(){

        //线程要执行的代码

    }

}

public class Main {

    public static void main(String[] args) {

        MyThread thread = new MyThread();//创建一个线程对象

        thread.start();//启动线程

    }

}

2. 实现Runnable接口

实现Runnable接口同样需要重写run方法,在run方法中编写线程的代码。使用Thread类的构造函数创建一个线程对象,将Runnable对象作为参数传入,使用start方法启动线程。示例代码如下:

public class MyTask implements Runnable {

    public void run() {

        // 线程要执行的代码

    }

}

public class Main {

    public static void main(String[] args) {

        MyTask task = new MyTask();//创建一个任务对象

        Thread thread = new Thread(task);//创建一个线程对象,将任务对象转换成线程对象

        thread.start();//启动线程

    }

}

3. 使用Callable实现多线程

Callable是Java中的一个接口,它用来实现带返回值的线程。与Runnable的run方法不同,callable的call方法可以返回线程的运算结果。同时,在执

行带有返回值的任务时需要使用Future来保存执行结果。示例代码如下:

public class MyCallable implements Callable<Integer>{

    public Integer call() throws Exception{

        // 计算和返回结果

        return 100;

    }

}

public class Main {

    public static void main(String[] args) throws Exception {

        ExecutorService executor = Executors.newSingleThreadExecutor();

        Future<Integer> result = executor.submit(new MyCallable());

        Integer sum = result.get();// 获取线程的返回值

        System.out.println(sum);

        executor.shutdown();

    }

}

Java中多线程的调度

在使用多线程的时候,我们需要注意所有线程都是并发执行的,它们之间的执行顺序是不确定的,取决于OS对线程的调度。Java提供了不同的方法来调度线程的执行,这些方法常用的有:

1. sleep方法

sleep方法使线程进入睡眠状态,暂停指定的时间,交出CPU给其他线程,经过的时间可以由另一个线程、或者OS调度器计算。示例代码如下:

public class MyThread extends Thread {

    public void run() {

        for (int i = 1; i <= 5; i++) {

            System.out.println(i);

            try {

                Thread.sleep(1000);// 线程休眠1秒

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

public class Main {

    public static void main(String[] args) throws InterruptedException {

        MyThread thread = new MyThread();

        thread.start();

    }

}

2. yield方法

yield方法使线程从运行状态转为就绪状态,它让出CPU时间让其他线程执行,但是不保证当前线程的让出的CPU时间(也就是当前线程Pause的时间)一定能够让其他线程一定执行。

public class YieldExample {

    public static void main(String[] args) {

        YieldTask task1 = new YieldTask("Task1");

        YieldTask task2 = new YieldTask("Task2");

        Thread thread1 = new Thread(task1);

        Thread thread2 = new Thread(task2);

        thread1.start();

        thread2.start();

    }

}

public class YieldTask implements Runnable {

    private String name;

    YieldTask(String name) {

        this.name = name;

    }

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(name + ": " + i);

            // 当i = 2时,让出CPU,转到线程调度实体决定下一个线程谁来执行

            if(i == 2){

                Thread.yield();

            }

        }

    }

}

3. join方法

join方法是用于等待一个线程执行结束的方法,让“主线程”或进程等待子线程结束后再继续执行。

4. wait、notify和notifyAll方法

wait、notify和notifyAll是Java中线程间的通信机制,这些方法只能在同步方法或同步块中使用。wait方法让线程处于等待状态,直到其他线程调用notify或notifyAll方法唤醒它;notify方法唤醒在等待中的线程,notifyAll方法唤醒所有在等待中的线程。

总结

Java多线程编程是很实用的技能,在实际应用中经常需要使用到多线程技术。在Java中实现多线程有多种方法可选择,常用的有继承Thread类、实现Runnable接口和使用Callable实现。同时,Java中也提供了多种方法来调度线程执行,如sleep、yield和join等。开发者在使用多线程的时候,需要深入理解线程的调度机制,根据具体的业务需求选择合适的调度方式,合理地使用多线程技术,可以提升程序的性能、降低系统负载。