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

Java函数如何进行线程控制,比如创建线程、停止线程、线程间通信等?

发布时间:2023-06-11 14:33:45

Java作为一种面向对象的编程语言,在多线程编程方面非常强大,支持线程的创建、停止、线程间通信等功能。本文将详细介绍Java函数如何进行线程控制。

1、创建线程

Java通过继承Thread类或实现Runnable接口来创建线程。具体方式如下:

(1)继承Thread类

创建线程的第一种方法是继承Thread类,如下所示:

public class MyThread extends Thread {
    public void run() {
        //线程运行的代码
    }
}

上述代码重写了Thread类中的run方法,通过调用start方法来启动线程,如下所示:

public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
}

(2)实现Runnable接口

创建线程的第二种方法是实现Runnable接口,如下所示:

public class MyRunnable implements Runnable{
    public void run() {
        //线程运行的代码
    }
}

上述代码实现了Runnable接口中的run方法,通过创建Thread对象并传入MyRunnable对象来启动线程,如下所示:

public static void main(String[] args) {
    MyRunnable runnable = new MyRunnable();
    Thread thread = new Thread(runnable);
    thread.start();
}

2、停止线程

停止线程的方法有两种,一是使用stop方法,二是使用interrupt方法。不建议使用stop方法,因为它太过粗暴,可能会引起数据错乱或内存泄漏等问题。因此我们一般使用interrupt方法,如下所示:

public class MyThread extends Thread {
    public void run() {
        try {
            while (!Thread.interrupted()) {
                //线程运行的代码
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代码通过使用Thread.interrupted()方法判断线程是否要终止,如果为false,则继续运行,否则跳出while循环,线程停止。

另外,我们也可以使用flag来控制线程是否停止,如下所示:

public class MyThread extends Thread {
    //标记位控制线程是否停止
    private boolean flag = false;
    public void run() {
        try {
            while (!flag) {
                //线程运行的代码
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void stopThread() {
        flag = true;
    }
}

上述代码通过使用flag标记位控制线程是否停止,通过调用stopThread方法来修改标记位,线程停止。

3、线程间通信

Java提供了两种线程间通信的方式,一种是通过共享变量通信,一种是通过wait/notify机制通信。

(1)通过共享变量通信

通过共享变量通信是一种非常简单有效的方式,我们可以定义一个共享变量,并使用synchronized关键字对它加锁,然后在线程之间进行读写操作,从而实现线程间通信。具体实现方法如下所示:

public class MyThread extends Thread {
    //共享变量
    private int sum = 0;
    public void run() {
        try {
            synchronized (this) {
                for (int i = 0; i < 100; i++) {
                    sum += i;
                }
                //唤醒等待线程
                notifyAll();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public int getSum() {
        return sum;
    }
}

上述代码通过synchronized关键字对sum变量进行加锁,确保线程间的同步,然后在run方法中进行变量的读写操作,最后通过notifyAll方法唤醒等待线程。等待线程可以通过wait方法来等待唤醒,如下所示:

public class MyThread extends Thread {
    //共享变量
    private int sum = 0;
    public void run() {
        try {
            synchronized (this) {
                for (int i = 0; i < 100; i++) {
                    sum += i;
                }
                //唤醒等待线程
                notifyAll();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public int getSum() {
        return sum;
    }
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        try {
            //等待线程唤醒
            synchronized (thread) {
                thread.wait();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //获取共享变量sum的值
        int sum = thread.getSum();
        System.out.println("sum=" + sum);
    }
}

上述代码通过wait方法等待线程唤醒,然后获取共享变量sum的值。

(2)通过wait/notify机制通信

通过wait/notify机制通信是一种较为复杂的方式,但它能够更加精细地控制线程间的同步和通信。具体实现方法如下:

public class MyThread extends Thread {
    //共享变量
    private boolean flag = false;
    public void run() {
        try {
            synchronized (this) {
                //判断共享变量flag是否满足条件
                while (!flag) {
                    wait();
                }
                //线程运行的代码
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void setFlag() {
        flag = true;
    }
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        //设置共享变量flag为true
        thread.setFlag();
        //唤醒等待线程
        synchronized (thread) {
            thread.notifyAll();
        }
    }
}

上述代码通过wait方法等待被唤醒,在main方法中设置共享变量flag为true,然后唤醒等待线程。需要注意的是,wait/notify方法必须在synchronized块中使用,并且wait方法会释放对象的锁,notify方法不会,因此notify方法通常在最后执行。

总结

本文详细介绍了Java函数如何进行线程控制,包括线程的创建、停止、线程间通信等,通过学习本文的内容,您可以更加熟练地掌握Java多线程编程技术,提高程序的效率和稳定性。