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

Java多线程编程中的常用函数及使用方式

发布时间:2023-06-19 11:00:12

Java多线程编程是非常常见的技术,在Java语言中提供了丰富的函数和类库,方便我们进行多线程编程。下面我们就来介绍一些Java多线程编程中常用的函数及使用方式。

1. Thread.sleep(long millis)

这个函数可以让当前线程暂停执行指定的时间,单位是毫秒。这个函数常用于模拟一些时间延迟,或者让线程暂停一段时间再执行下一个任务。

使用方式:

try {
    Thread.sleep(1000); //线程暂停1秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

2. Thread.yield()

这个函数可以让当前线程放弃CPU执行时间,让其他线程执行。这个函数常用于协调多个线程的执行顺序,避免某个线程一直占用CPU资源。

使用方式:

Thread.yield(); //线程放弃CPU执行时间

3. Thread.join()

这个函数可以让一个线程等待其他线程执行完毕再继续执行。这个函数常用于协调多个线程的执行顺序,保证子线程完成后再执行主线程。

使用方式:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        //执行子线程任务
    }
});

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

try {
    thread.join(); //等待子线程执行完毕
} catch (InterruptedException e) {
    e.printStackTrace();
}

4. wait()、notify()、notifyAll()

这三个函数常用于线程间的协作操作,wait()可以让线程进入等待状态,只有当其他线程调用notify()或notifyAll()才能让该线程继续执行。notify()和notifyAll()分别用于唤醒一个或多个处于等待状态的线程。

使用方式:

public class LockTest {
    private boolean flag = true;

    public synchronized void methodA() {
        while (flag) {
            try {
                wait(); //线程进入等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("methodA");
        flag = true;

        notifyAll(); //唤醒处于等待状态的线程
    }

    public synchronized void methodB() {
        while (!flag) {
            try {
                wait(); //线程进入等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("methodB");
        flag = false;

        notifyAll(); //唤醒处于等待状态的线程
    }
}

LockTest lockTest = new LockTest();

Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run() {
        lockTest.methodA();
    }
});

Thread thread2 = new Thread(new Runnable() {
    @Override
    public void run() {
        lockTest.methodB();
    }
});

thread1.start();
thread2.start();

上面的代码演示了使用wait()、notify()、notifyAll()实现线程间的协作操作。

5. ThreadLocal类

ThreadLocal类可以让每个线程拥有自己的变量副本,避免不同线程之间的变量互相干扰。这个类常用于实现线程安全的代码。

使用方式:

public class Counter {
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 0; //初始化一个值
        }
    };

    public void increment() {
        int count = threadLocal.get(); //获取当前线程的变量副本
        count++;
        threadLocal.set(count); //保存当前线程的变量副本
    }

    public int getCount() {
        return threadLocal.get(); //获取当前线程的变量副本
    }
}

Counter counter = new Counter();

Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            counter.increment();
            System.out.println("Thread1 count: " + counter.getCount());
        }
    }
});

Thread thread2 = new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            counter.increment();
            System.out.println("Thread2 count: " + counter.getCount());
        }
    }
});

thread1.start();
thread2.start();

上面的代码演示了使用ThreadLocal类实现线程安全的计数器。

以上就是Java多线程编程中常用的函数及使用方式。在实际编程中,我们还可以使用Java并发包中的类库来实现更为复杂的多线程编程,比如线程池、锁机制、原子变量等。